Lambda演算表达式实现函数应用

Phi*_*sky 6 lambda functional-programming combinators lambda-calculus higher-order-functions

我刚刚发现了以下lambda演算表达式:

(((? f . (? x . (f x))) (? a . a)) (? b . b))
Run Code Online (Sandbox Code Playgroud)

所以这是一个函数,它接受一个参数f并返回另一个带有参数x的函数,并产生应用于f的x的结果.上述表达式的结果将是(λb.b).

这让我想起部分应用和currying,但是"由内而外"的功能应用程序(fx)引起了我的兴趣.

那个表达有更深刻的理论意义吗?

Ken*_*nde 8

这个表达式实际上非常酷,即使它是一个非常简单的操作.毕竟,功能只是功能应用,对吧?

这就是事情变得有趣的地方.在lambda演算中,应用程序是一个句法规则,它简单地说"If f是表达式并且x是表达式,然后f x是表达式".应用程序不是任何类型的功能.这是不幸的:由于lambda演算完全与函数有关,因此必须严重依赖于不是函数的东西!

你的例子是对此的一种补救措施.虽然我们无法摆脱应用程序,但我们至少可以定义应用程序的对应物.那个对应物是lambda函数(? f . (? x . (f x)))(或更具惯用性?fx.f x).这一个函数,所以我们可以推理它并像使用任何其他函数一样使用它.我们可以将它作为参数传递给其他函数,也可以作为函数的结果使用.突然间,功能应用程序变得更加实用.

就像lambda演算一样,这就是我所拥有的,但是这个函数以及其他类似函数在现实生活中也非常有用.在函数式编程语言F#中,这个函数甚至有一个名称,"管道向后运算符",我们写它有中缀运算符<|.以书面形式替代f (x),其中x一些表现,我们可以写f <| x.这很好,因为它通常可以让我们免于编写很多恼人的括号.我试图在这里提出的关键点是,虽然一眼就看出你的例子看起来很学术,或者可能只是不太有帮助,但它实际上已经进入了几种主流编程语言.