Rog*_*llo 6 lambda haskell combinators lambda-calculus combinatory-logic
我现在明白了类型签名s (s k):
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
Run Code Online (Sandbox Code Playgroud)
我可以在Haskell WinGHCi工具中创建无错误的示例:
示例:
s (s k) (\g -> 2) (\x -> 3)
Run Code Online (Sandbox Code Playgroud)
回报2.
示例:
s (s k) (\g -> g 3) successor
Run Code Online (Sandbox Code Playgroud)
回报4.
其中successor定义如下:
successor = (\x -> x + 1)
Run Code Online (Sandbox Code Playgroud)
尽管如此,我仍然没有一个直观的感受了什么s (s k)呢.
该组合子s (s k)采取任何两个函数f和g.什么是s (s k)用做f与g?你能给我的大图片上有什么s (s k)不讨好?
Vit*_*tus 11
好吧,让我们来看看是什么S (S K)意思.我将使用这些定义:
S = \x y z -> x z (y z)
K = \x y -> x
S (S K) = (\x y z -> x z (y z)) ((\x y z -> x z (y z)) (\a b -> a)) -- rename bound variables in K
= (\x y z -> x z (y z)) (\y z -> (\a b -> a) z (y z)) -- apply S to K
= (\x y z -> x z (y z)) (\y z -> (\b -> z) (y z)) -- apply K to z
= (\x y z -> x z (y z)) (\y z -> z) -- apply (\_ -> z) to (y z)
= (\x y z -> x z (y z)) (\a b -> b) -- rename bound variables
= (\y z -> (\a b -> b) z (y z)) -- apply S to (\a b -> b)
= (\y z -> (\b -> b) (y z)) -- apply (\a b -> b) to z
= (\y z -> y z) -- apply id to (y z)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只是($)具有更具体的类型.