【发布时间】:2011-01-21 20:51:51
【问题描述】:
我最近花了一些时间来研究 Y 组合器,我发现它通常定义(或多或少)如下(这是在 C# 中,但选择的语言并不重要):
public delegate TResult SelfApplicable<TResult>(SelfApplicable<TResult> r);
public static TResult U<TResult>(SelfApplicable<TResult> r)
{
return r(r);
}
public static Func<TArg1, TReturn> Y<TArg1, TReturn>(Func<Func<TArg1, TReturn>, Func<TArg1, TReturn>> f)
{
return U<Func<TArg1, TReturn>>(r => arg1 => f(U(r))(arg1));
}
虽然这是完美的功能(双关语),但我的定义似乎要简单得多:
public static Func<TArg1, TReturn> Y<TArg1, TReturn>(Func<Func<TArg1, TReturn>, Func<TArg1, TReturn>> f)
{
return f(n => Y(f)(n));
}
后一个定义不那么普遍(我还没有在网上找到)有什么原因吗?它可能与根据自身定义 Y 有关吗?
【问题讨论】:
-
天哪,Y 组合器。我故意设法避开了我们课程的那一部分,..我的大脑是这样的。 x__x 但是+1,好问题。
-
这是一个定点组合器,但我不确定它实际上是 Y 组合器。我也很好奇,让我们看看更有知识的人怎么说……
-
Y组合子不是用来实现递归的吗?意思是,你不能用它来实现递归
-
@Lou Franco:糟糕!是的,听起来不错。
Y将允许人们用一种本身不支持递归的语言来实现递归,只要该语言支持高阶函数即可。递归地定义Y违背了它的初衷(尽管它在某些情况下仍然有用)。 -
您的定义看起来就像
fix函数的 Haskell 定义:fix f = let x = f x in x。 Source (haskell.org)
标签: c# functional-programming y-combinator