首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Y-组合器的实现

理解Y-组合器的实现
EN

Stack Overflow用户
提问于 2018-11-27 02:31:33
回答 2查看 913关注 0票数 7

我想详细了解一下我们是如何从Y-combinator的lambda演算表达式中得到的:

代码语言:javascript
复制
Y = λf.(λx.f (x x)) (λx.f (x x))

以下实现(在Scala中):

代码语言:javascript
复制
def Y[A, B](f: (A => B) => A => B): A => B = (x: A) => f(Y(f))(x)

我对函数式编程非常陌生,但我对lambda微积分和替代过程是如何工作的有很好的理解。然而,我很难理解我们是如何从正式表达到实现的。

此外,我还想知道如何告诉函数的类型参数的number ,以及函数的返回类型(无论是什么lambdaE 211)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-28 00:29:32

请注意,您编写的不是Y组合器的实现。"Y组合子“是λ演算中的一个特定的”定点组合子“。术语g的“定点”就是点x

代码语言:javascript
复制
g(x) = x 

“定点组合器”F是一个可以用来“生成”定点的术语。就是这样,

代码语言:javascript
复制
g(F(g)) = F(g)

术语Y = λf.(λx.f (x x)) (λx.f (x x))是许多遵循该方程的术语之一,也就是说,在某种意义上,g(Y(g)) = Y(g)可以简化为另一个术语。这个属性意味着这样的术语,包括Y,可以用来在微积分中“编码递归”。

关于输入,请注意,Y组合器不能在简单类型的λ-演算中键入。即使在系统F的多态演算中也不是。如果你试图键入它,你就会得到一种“无限深度”。要键入它,需要在类型级别进行递归。因此,如果您想将例如简单类型的Y演算扩展到一种小型函数式编程语言,那么您可以将λ作为一个原语提供。

不过,您没有使用λ微积分,而且您的语言已经带有递归。因此,您所写的是Scala中定点"combinator“的简单定义。直截了当,因为作为一个定点(几乎)跟随(几乎)的定义。

代码语言:javascript
复制
Y(f)(x) = f(Y(f))(x)

因此,对于所有x (它是一个纯函数),

代码语言:javascript
复制
Y(f) = f(Y(f))

它是不动点的方程。关于Y类型的推论,考虑Y(f)(x) = f(Y(f))(x)方程,

代码语言:javascript
复制
f : A => B
Y : C => D 

因为Y : C => Df : A => B作为输入,

代码语言:javascript
复制
C = A => B

因为Y f : Df : A => B的输入

代码语言:javascript
复制
D = A

由于输出Y f : Df(Y(f)) : B的输出相同,所以

代码语言:javascript
复制
D = B

到目前为止,

代码语言:javascript
复制
Y : (A => A) => A 

由于Y(f)应用于x,所以Y(f)是一个函数,因此

代码语言:javascript
复制
A = A1 => B1 

对于某些类型的A1B1,因此,

代码语言:javascript
复制
Y : ((A1 => B1) => (A1 => B1)) => A1 => B1
票数 4
EN

Stack Overflow用户

发布于 2018-11-27 03:55:06

首先,Scala代码需要很长时间才能编写:

代码语言:javascript
复制
def Y[A, B](f: (A => B) => A => B): A => B = f(Y(f))

在这里,f被部分应用。(看起来,代码作者选择使用lambda来使其更加显式。)

现在,我们如何得出这个代码?维基百科那个Y f = f (Y f)。把它扩展到类似Scala的东西,我们有def Y(f) = f(Y(f))。在lambda演算中,这不是一个定义,它不允许直接递归,但它在Scala中工作。要使它成为有效的Scala,我们需要添加类型。向f中添加类型将导致:

代码语言:javascript
复制
def Y(f: (A => B) => A => B) = f(Y(f))

由于AB是免费的,我们需要将它们设置为参数类型:

代码语言:javascript
复制
def Y[A, B](f: (A => B) => A => B) = f(Y(f))

由于它是递归的,所以我们需要添加一个返回类型:

代码语言:javascript
复制
def Y[A, B](f: (A => B) => A => B): A => B = f(Y(f))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53491916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档