首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Y-组合器在D?

Y-组合器在D?
EN

Stack Overflow用户
提问于 2011-08-04 07:44:25
回答 4查看 295关注 0票数 8

我正在努力更好地学习Y-combinator (我在Scheme中有点理解它),并在D2.0中实现它,而且我失败得非常糟糕:

代码语言:javascript
复制
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-组合器?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-04 09:09:33

请参阅这里的详细解释。

票数 7
EN

Stack Overflow用户

发布于 2011-08-04 15:53:49

D(和C/C++)的一个已知限制是,处理类型化自引用的函数不可能声明(上次检查)。

我觉得这具有讽刺意味,因为它相当于语法的限制(函数原型的长度是无限的)或命名约定(同样的问题,但名称损坏),而不是任何语义或体系结构的限制。

票数 4
EN

Stack Overflow用户

发布于 2011-08-04 08:13:05

我不知道D,但是在大多数语言中,当您尝试实现非递归时,函数的类型会出现问题(您的代码中还没有Y-组合子)。通常的方法是通过将类型分离成几个部分来实现,这样就可以将递归转换到类型中。

其他语言的一些例子:

  • 在C语言中,通常编写包含函数指针的结构。这样,这个结构就可以用作一个参数。
  • 在OCaml中,将添加一个包装函数类型的变体类型。同样,这允许分离类型,因此可以进行类型递归。

如果您想要从其他语言中获得一些例子,请看一下此页

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6937851

复制
相关文章

相似问题

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