我正試圖在哈斯克爾實現教會數字,但我遇到了一個小問題。 Haskell的抱怨無限型與哈斯克爾教會數字減法
的發生檢查:無法構造無限類型:T =(T - > T1) - 當我嘗試做減法> T2
- >(T1 - > 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
你應該做的類型聲明'型教會=(A - > A) - > A - >了'。它更乾淨,沒有不同。 – alternative
另請注意,它有助於寫出類型簽名。它會告訴你究竟問題出在哪裏...... – alternative
我最終刪除了類型簽名,看看ghci是否可以正確推斷它們,並希望擺脫錯誤(錯誤沒有改變)...另外,我更喜歡這個類型的括號。這使得它更加脫穎而出 – Probie