高階関数とカリー化

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"