高階関数とカリー化

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"