Я играю с некоторыми материалами лямбда-исчисления в Haskell, в частности церковными цифрами. У меня определено следующее:
let zero = (\f z -> z)
let one = (\f z -> f z)
let two = (\f z -> f (f z))
let iszero = (\n -> n (\x -> (\x y -> y)) (\x y -> x))
let mult = (\m n -> (\s z -> m (\x -> n s x) z))
Это работает:
:t (\n -> (iszero n) one (mult one one))
Это не выполняется с проверкой наличия:
:t (\n -> (iszero n) one (mult n one))
Я играл с iszero
и mult
с моими константами, и они кажутся правильными. Есть ли способ сделать этот тип? Я не думал, что то, что я делаю, слишком сумасшедшее, но, может быть, я что-то делаю неправильно?