我正在尝试在Haskell中实现Church数,但遇到了一个小问题。当我尝试进行减法时,Haskell会抱怨出现无限类型的错误:
出现检查:无法构造无限类型:t = (t -> t1) -> (t1 -> t2) -> t2
我有99%的把握我的λ演算是正确的(如果不是,请告诉我)。我想知道的是,是否有什么方法可以让Haskell与我的函数一起工作。
出现检查:无法构造无限类型:t = (t -> t1) -> (t1 -> t2) -> t2
我有99%的把握我的λ演算是正确的(如果不是,请告诉我)。我想知道的是,是否有什么方法可以让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
,这样更加简洁,没有差别。 - alternative