map,zip,zipWith などのように引数に関数をとる関数を高階関数という。
まぁ,すでに今までにもずいぶん使ってるんだけど。
ちょっと練習。chrOr,chrAnd は '1' または '0' を2つ引数にとってビット演算もどきをする。
zipWith と組み合わせれば文字列のビット演算もどきができる。
chrOr a b | a == '1' || b == '1' = '0' | otherwise = '1' chrAnd a b | a == '1' && b == '1' = '1' | otherwise = '0'
*Main> zipWith chrOr "10010010" "10011100" "01100001" *Main> zipWith chrAnd "10010010" "10011100" "10010000"
複数の引数をとる関数に,より少ない数の引数を与えると,残りの数の引数をとる関数ができる。これをカリー化という。
ちょっと説明がわかりにくいな。たとえば2つの引数をとる関数 f a b に引数を1つだけ与えると,1つの引数をとる関数 g b ができるってこと。
上の例で言えば,zipWith に chrOr やchrAnd を与えると strOr や strAnd ができる。
strOr = zipWith chrOr strAnd = zipWith chrAnd
*Main> strOr "10010010" "10011100" "01100001" *Main> strAnd "10010010" "10011100" "10010000"