HaskellでChurch Pairsの練習
Church Pairsとはウィキペディアを参照すると:
Church encoding - Wikipedia, the free encyclopedia
となっています。これをHaskellで書き下すと:
Prelude> let pair = \x -> \y -> \z -> z x y
これを、使ってみると:
Prelude> pair 4 5 (+) 9 Prelude Control.Monad.State> pair 4 5 (*) 20
第3引数は引数を2つとる関数なので(第1、2引数がNum型の場合)+や*を使うことが出来ます。 実際の第3引数はタプルなんでしょうけど。
Prelude> pair 4 5 (,) (4,5) Prelude> pair 4 'a' (,) (4,'a') Prelude> :t pair 4 'a' (,) pair 4 'a' (,) :: Num t1 => (t1, Char) Prelude>
続いてfst, andを定義します:
Prelude Control.Monad.State> let first = \p -> p (\x -> \y -> x) Prelude Control.Monad.State> let second = \p -> p (\x -> \y -> y)
型を確認します:
Prelude> :t first first :: ((t2 -> t1 -> t2) -> t) -> t Prelude> :t second second :: ((t1 -> t2 -> t2) -> t) -> t Prelude>
※なんでこの型になるか理解できず....。
first, secondを使ってみると:
Prelude> first (pair 1 2) 1 Prelude> first (pair 1 'a') 1 Prelude> second (pair 1 'a') 'a'
となりタプルであることが確認できました。