8

私はYコンビネーターをよりよく学び(Schemeである程度理解している)、D 2.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コンビネーターを実装できますか?

4

4 に答える 4

7

詳細な説明はこちらをご覧ください。

于 2011-08-04T09:09:33.837 に答える
4

型付き自己参照を処理する関数が(前回チェックしたときに)宣言できないことは、D(およびC / C ++)の既知の制限です。

これは、意味論的またはアーキテクチャ的なものではなく、構文の制限(関数プロトタイプの長さが無限大)または命名規則(同じ問題ですが、名前のマングリングを伴う)に相当するため、皮肉なことです。

于 2011-08-04T15:53:49.890 に答える
3

私は D を知りませんが、ほとんどの言語では、非再帰を実装しようとすると、関数の型に関する問題が発生します (コードにはまだ Y-Combinator がありません)。通常の方法は、型をいくつかの部分に分割し、この方法で型に再帰を取得することで実現できます。

他の言語の例:

  • C では、通常、関数ポインタを含む構造体を記述します。この構造体は、引数として使用できます。

  • OCaml では、関数型をラップするバリアント型を追加します。繰り返しますが、これにより型を分離できるため、型の再帰が可能になります。

他の言語の例が必要な場合は、このページをご覧ください。

于 2011-08-04T08:13:05.450 に答える