読者です 読者をやめる 読者になる 読者になる

【D言語】無名再帰してみる

D言語

無名再帰と言えば不動点コンビネータですね。 D言語だと、定義のとおりに不動点コンビネータを書けます。


R delegate(Args) fix(R, Args...)(R delegate(R delegate(Args), Args) f)
{
    return (Args args) => f(fix(f), args);
}

ラムダ構文があるので、少し楽に書けます。 上で定義した不動点コンビネータを使うと、以下のように無名再帰ができます。


R delegate(Args) fix(R, Args...)(R delegate(R delegate(Args), Args) f)
{
    return (Args args) => f(fix(f), args);
}

void main()
{
    import std.stdio;
    fix((int delegate(int) rec, int num) => num != 0 ? num * rec(num - 1) : 1)(5).writeln();
}

残寝ながら、recとnumの引数の型は省略できません。そこまで推論してくれないみたいですね。

参考:Wikipedia「不動点コンビネータ」

担当:美馬(型を省略したい・・・)