我正在努力解决问题,但你能在代码战上滑雪吗?它即将在 SKI 组合器中表达 lambda。来源在https://repl.it/@delta4d/SKI。
经过一些研究,尤其是组合逻辑,我能够解决除xor
.
我首先将 xor 翻译成
xor x y = if y
then if x
then false
else true
else x
这是
xor = \x y -> y (x false true) x
-- false = K I
-- true = K
将 lambda 应用于 SKI 规则,我得到了
\x.\y.y (x false true) x
\x.S (\y.y (x false true)) (K x)
\x.S (S I (K (x false true))) (K x)
S (\x.S (S I (K (x false true)))) K
S (S (K S) (\x.S I (K (x false true)))) K
S (S (K S) (S (K (S I)) (\x.K (x false true)))) K
S (S (K S) (S (K (S I)) (S (K K) (\x.x false true)))) K
S (S (K S) (S (K (S I)) (S (K K) (S (\x.x false) (K true))))) K
S (S (K S) (S (K (S I)) (S (K K) (S (S I (K false)) (K true))))) K
我检查了http://ski.aditsu.net上的 SKI 演示文稿,效果很好。
Haskell 源代码编译,但出现运行时错误。
代码战报告:
Couldn't match type `a' with `Bool' a' `a' is a rigid type variable bound by a type expected by the context: a -> a -> a at Kata.hs:66:9 Expected type: SKI (Bool' a -> (Bool' a -> Bool' a -> Bool' a) -> a -> a -> a) Actual type: SKI (Bool' (Bool' a)) In the second argument of `xorF', namely `true' In the second argument of `($)', namely `xorF true true'
我在本地进行了测试prettyPrintSKI $ Ap (Ap xor' false) true
,它报告:
• Occurs check: cannot construct the infinite type: a20 ~ Bool' a20 Expected type: SKI (Bool' a20 -> (Bool' a20 -> Bool' a20 -> Bool' a20) -> Bool' a20) Actual type: SKI (Bool' (Bool' a20)) • In the second argument of ‘Ap’, namely ‘true’ In the second argument of ‘($)’, namely ‘Ap (Ap xor' false) true’ In the expression: prettyPrintSKI $ Ap (Ap xor' false) true
无限类型是什么?什么是刚性类型?
我在or
as上做同样的事情or = \x y -> x true y
,它工作得很好。