ラムダ計算

ラムダ計算はまったくわからんのですが,一応コードを書いたのでメモ.かけ算よりむしろ足し算のほうが難しかった.
and と or はちょいと考えたけどわからなかったので wikipedia で調べた.足し算かけ算に比べるとなんとなく感動が薄い.笑
ラムダ計算での整数の扱いって継続渡しっぽいなぁとか思った.継続渡しがなんたるかをよく知らないのでなんとも言えないけど.

-- encoder, decoder
ch2int churchNum = churchNum (1+) 0
int2ch 0 = z
int2ch n = s (int2ch $ n-1)
-- church encoding
-- zero = \f x -> x
-- one  = \f x -> f x
-- ...
z = \f x -> x
-- succ
-- two f x = f (one f x)
s = \cn f x -> f (cn f x)
-- plus
-- three f x = (two f x) (one f x)
p = \cn1 cn2 f x -> cn1 f (cn2 f x)
-- mult
-- six f x = (three (two f) x) 
m = \cn1 cn2 f x -> cn1 (cn2 f) x

-- boolean
ch2bool churchBool = churchBool True False
bool2ch b = if b then t else f
t = \t f -> t
f = \t f -> f
n = \cb t f -> cb f t
a = \lb1 lb2 -> lb1 lb2 f
o  = \lb1 lb2 -> lb1 t lb2