読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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'

となりタプルであることが確認できました。