【发布时间】:2011-09-29 13:25:28
【问题描述】:
我正在尝试在 Haskell 中实现教堂数字,但遇到了一个小问题。 Haskell 用
抱怨无限类型发生检查:无法构造无限类型:t = (t -> t1) -> (t1 -> t2) -> t2
当我尝试做减法时。我 99% 肯定我的 lambda 演算是有效的(如果不是,请告诉我)。我想知道的是,我是否可以做些什么来让 haskell 与我的函数一起工作。
module Church where
type (Church a) = ((a -> a) -> (a -> a))
makeChurch :: Int -> (Church a)
makeChurch 0 = \f -> \x -> x
makeChurch n = \f -> \x -> f (makeChurch (n-1) f x)
numChurch x = (x succ) 0
showChurch x = show $ numChurch x
succChurch = \n -> \f -> \x -> f (n f x)
multChurch = \f2 -> \x2 -> \f1 -> \x1 -> f2 (x2 f1) x1
powerChurch = \exp -> \n -> exp (multChurch n) (makeChurch 1)
predChurch = \n -> \f -> \x -> n (\g -> \h -> h (g f)) (\u -> x) (\u -> u)
subChurch = \m -> \n -> (n predChurch) m
【问题讨论】:
-
您应该进行类型声明
type Church a = (a -> a) -> a -> a。它更干净,没有什么不同。 -
另请注意,写出类型签名会很有帮助。它会告诉你问题出在哪里……
-
我最终删除了类型签名,看看 ghci 是否可以正确推断它们,并希望摆脱错误(错误没有改变)......而且,我更喜欢括号周围类型。它让我更加突出
标签: haskell lambda-calculus church-encoding