ラムダ計算
ラムダ計算はまったくわからんのですが,一応コードを書いたのでメモ.かけ算よりむしろ足し算のほうが難しかった.
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