(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引数の関数になるんですね。知らずにやったから結構驚きました。後で調べたところ、部分適用というやつらしいですね。ひとつ前のコードの、(==)は、中置記法だと部分適用がされないために、先頭に書かないと怒られたんですね、多分。