这个组合器做什么:s(sk)

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)采取任何两个函数fg.什么是s (s k)用做fg?你能给我的大图片上有什么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)

正如您所看到的,它只是($)具有更具体的类型.

  • @ AntalS-Z,在你自己概括的类型上吸引参数化是有点厚颜无耻的:P这是真的,这里的类型几乎要求函数是一个类型限制的标识,但是例如`(a - > a) - >(a - > a)`是某些`α`的'α - >α`的另一种类型,但有很多非同一性值. (3认同)
  • 另一种看法:`((t1 - > t2) - > t1) - >(t1 - > t2) - > t1`.添加括号,我们得到`((t1 - > t2) - > t1) - >((t1 - > t2) - > t1)`.让类型`α`代表`(t1 - > t2) - > t1`,这只是'α - >α`,因此,通过参数化,`s(sk)`是具有更具体的标识函数类型.(当然,`($)::(a - > b) - > a - > b`也是*只是具有更具体类型的标识函数.) (2认同)