(x==)について
昨日のプログラムは元々、(x==)の部分が、ほかの関数になってもいいように切り出していたんですね、実は。なんで、duplicateのこの部分を、引数として与えられるようにしてみます。
duplicate cond (x:xs) = any (cond x) xs || duplicate cond xs duplicate _ _ = False main = do print $ duplicate (\ x -> (==) x) ([1..100] ++ [99])
紆余曲折を経て、こうなりました。(\x->(==)x)は、Haskellの無名関数の書き方だそうです。closureというやつですね。==は括弧を付けないと怒られました。で、さらにclosureの部分をいじってみると、
duplicate cond (x:xs) = any (cond x) xs || duplicate cond xs duplicate _ _ = False main = do print $ duplicate (\ x y -> (==) x y) ([1..100] ++ [99])
これでも動きました。2引数の関数に1つ引数を渡すと、1引数の関数になるんですね。知らずにやったから結構驚きました。後で調べたところ、部分適用というやつらしいですね。ひとつ前のコードの、(==)は、中置記法だと部分適用がされないために、先頭に書かないと怒られたんですね、多分。