我正在使用Haskell玩一些lambda演算的东西,具体来说是关于Church数。 我定义了以下内容:
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
,它们似乎是正确的。有没有什么方法可以使这些可输入?我认为我所做的并不太疯狂,但也许我做错了什么?
mult m n = m (plus n) zero
这样的东西时,上述限制将会发挥作用,这是未类型化lambda中的有效表达式,但在类型化中需要不定量多态性。这是Oleg的解决方法:http://okmij.org/ftp/Haskell/types.html#some-impredicativity - Ed'ka