我已经读了一位最近关于编程功能和我想神交Y组合.我的理解是,可以使用Y-组合的有效执行递归的一种语言,不支持递归的。但是,每一种语言,我可能使用已经支持递归,所以我不知道如何用它将使用Y组合。

是否有更好的实际例子的Y-组合的使用情况,我的失踪?有人实际使用一个在真实的生产码?或是使用Y组合的真的只是一个心态弯曲的学术活动(尽管是一个很酷的一个)。

有帮助吗?

解决方案

我要与其他的答案不同意:定点(Y)组合子的的具有实际应用,但它需要一个非常富有想象力,找到他们。像布鲁斯·麦克亚当。下面是他的论文抽象的一切差不多向上

  

用于计算固定点的Y组合可以在标准ML表示。它经常被用作的高阶函数的功率的一个例子,但通常不被看作是有用的编程构造。在这里,我们就来看看基于Y组合子和包装一个编程技术如何能够给程序员控制的水平上的功能,没有其他可能的内部运作,而不需要重写和重新编译代码。作为一个实验,类型推理算法W被使用这种技术来实现,从而使错误消息与所述算法最小干扰产生的。在这个例子程序中的代码示出的概念,并且与它们可以应用的容易性的真正的有用性。还讨论了一些其他实施技术和可能的应用,包括使用高阶函数来模拟使用异常和连续的。

这是一个很大的纸;有兴趣的函数式编程可能会喜欢阅读它。

其他提示

你可以看看这个漂亮的后在执行Y组合在C#: 递氧表达式, 它可能会帮助您理解的理念更好。

你可能会想看看一些不错的文章在维基百科: 固定点的组合固定点的定理

因为内森说,许多功能技术相关的Y组合并是有用的,因此,保持它!Y真的是有用的,因为它可以让你了解你的代码的更好,但我不认为这是一个特别有用来描述它如何帮助。

可以认为组合子为是运行在功能,您可以通过一个非递归功能(=高阶函数)描述了虚拟机的

有时它会是不错的程序控制下这个组合子,做类似的事情,面向方面的编程(memoizing,跟踪,...),但没有编程语言,我知道的允许它。也许这将是太麻烦了大部分的时间和/或太硬学习。

其他可以纠正我,如果我错了,但我敢肯定的Y组合是严格的学术。想想看:实现它你的语言需要支持更高阶的功能,但不递归。这里只有一种语言,我知道这样的:演算

因此,除非我们的机器从图灵机切换到上演算运行时,Y组合将严格的学术。

注:其他相关的Y组合的官能技术有用的,所以保持它。理解Y组合将帮助您了解延续,懒惰的评价,等等。

let sprite = pipe4 sprite_start blanks (manyTill attribute newline) blanks (fun a b c _ -> Sprite(a,c))

let sprites = 
    let rec y f x = f (y f) x // The Y Combinator
    //let rec sprites_up = many1Indents sprite sprites_up |>> (fun x -> SubSprites x) // Does not work.
    let sprites_up = y (fun f -> many1Indents sprite f |>> (fun x -> SubSprites x))
    many1Indents sprite sprites_up

下面是从编译器为一个很小的游戏库我在F#制作的例子。更具体地,在上述我需要有sprites_up递归调用自身否则压痕解析器将无法正常工作。

如果没有Y组合,我不能做正确的解析器和将不得不求助于写是这样的:

let sprites_up4 = many1Indents sprite error |>> (fun x -> SubSprites x) 
let sprites_up3 = many1Indents sprite sprites_up4 |>> (fun x -> SubSprites x) 
let sprites_up2 = many1Indents sprite sprites_up3 |>> (fun x -> SubSprites x) 
let sprites_up1 = many1Indents sprite sprites_up2 |>> (fun x -> SubSprites x) 
let sprites_up = many1Indents sprite sprites_up1 |>> (fun x -> SubSprites x) 

就不会是一个伟大的解决方案,在Y Combinator的真是救了我那里。这当然不是说来,虽然想到的第一件事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top