【问题标题】:S combinator in ErlangErlang中的S组合器
【发布时间】:2011-10-17 06:52:50
【问题描述】:

我开始学习 lambda 演算,我需要在 Erlang 中实现 I、S、K 组合子。 当然,S,K,I代表:

S = λxyz.xz(yz) K = λxy.x I = λx.x

我在纸上理解 I=SKK 转换没有问题(就像这里介绍的:To prove SKK and II are beta equivalent, lambda calculus),但是当涉及到函数式语言和高阶函数时,我似乎不理解它......

我设法做到了 I 和 K(让我们在模块 test 中说):

i(X) -> X.
k(X) -> fun(Y) -> X end.

我也知道如何运行 K x (K x) (SKK x = K x (K x))

kxk(X) -> (k(X))(k(X)).

但我无法编写 S 组合器。我试过了:

s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end.

但是,我仍然无法将 SKK x 转换为 x

我尝试这样运行它:

skkx(X) ->  s((k((k(X))))).

任何帮助将不胜感激,因为我完全迷路了。

【问题讨论】:

  • 确实,您的问题纯粹是符号问题。如果您了解 beta-reduction 的工作原理,那么您肯定会理解这个想法。其余的只是符号。

标签: lambda erlang lambda-calculus s-combinator


【解决方案1】:

来自 Erlang shell:

1> I = fun (X) -> X end.
#Fun<erl_eval.6.80247286>
2> K = fun (X) -> fun (Y) -> X end end.
#Fun<erl_eval.6.80247286>
3> S = fun (X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end end.
#Fun<erl_eval.6.80247286>
4> ((S(K))(K))(42).
42

或者作为模块中的函数:

i(X) -> X.
k(X) -> fun(Y) -> X end.
s(X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end.

【讨论】:

  • 好吧,我似乎还有一些问题:/ 在我的模块中,我有:i(X) -> X. k(X) -> fun(Y) -> X end。 s(X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end。 skk(X) ->((s(k))(k))(X)。当我运行时(tppr 是模块名称):tppr:skk(x). 我得到:** exception error: bad function k in function tppr:'-s/1-fun-0-'/3 我错过了什么?
  • 在您对 skk(X) ->((s(k))(k))(X) 的定义中,您编写了小写 k - 这是原子“k”,而不是函数 k /1。如果你改为写 skk(X) ->((s(fun k/1))(fun k/1))(X),它应该可以工作。
  • 谢谢,是的,就是这样,我必须承认,这很愚蠢;)
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2011-07-05
  • 2018-01-25
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多