我正在努力更好地学习Y-combinator (我在Scheme中有点理解它),并在D2.0中实现它,而且我失败得非常糟糕:
auto fact = delegate(uint delegate(uint) recurse)
{
return delegate(uint n)
{
return n > 1 ? n * recurse(n - 1) : 1;
};
};
fact(fact)(5);这不起作用,原因很明显,我不能将fact传递给fact (它的类型是什么?)此外,我仍然需要fact的名字传递给自己,所以它无论如何都不会起作用,对吗?
但是..。如何在D中实现Y-组合器?
发布于 2011-08-04 09:09:33
请参阅这里的详细解释。
发布于 2011-08-04 15:53:49
D(和C/C++)的一个已知限制是,处理类型化自引用的函数不可能声明(上次检查)。
我觉得这具有讽刺意味,因为它相当于语法的限制(函数原型的长度是无限的)或命名约定(同样的问题,但名称损坏),而不是任何语义或体系结构的限制。
发布于 2011-08-04 08:13:05
我不知道D,但是在大多数语言中,当您尝试实现非递归时,函数的类型会出现问题(您的代码中还没有Y-组合子)。通常的方法是通过将类型分离成几个部分来实现,这样就可以将递归转换到类型中。
其他语言的一些例子:
如果您想要从其他语言中获得一些例子,请看一下此页。
https://stackoverflow.com/questions/6937851
复制相似问题