自由モノイドプログラミング言語の作成(MonIter バージョン1.2 仕様(18))
MonIter コードの実行
引数で渡すバージョン
MonIter のコード(スペース、改行などは無視されます)
def fib(x, y) = x & fib(y, x + y);
fib(0, 1)を実行するには以下のようにします。Take は自由モノイドの先頭から指定した数の項を取得します。GetCount は個数をテキストボックスから取得します。ここでは 20 となっています。
/// <summary> /// フィボナッチ数列 MonIter 版(引数あり) /// </summary> /// <returns>フィボナッチ数列の文字列</returns> private string InfiniteFibpnacciPrms() { string src = "def fib(x, y) = x & fib(y, x + y); fib(0, 1)"; Prog prog = MonParser.ParseProg(src); return string.Join(", ", prog.Eval().Take(GetCount())); }
結果は以下のようになります。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
Zip を使うバージョン
MonIter のコード
def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y)));
fib(0, 1)を実行するには以下のようにします。
/// <summary> /// フィボナッチ数列 MonIter 版(Zip) /// </summary> /// <returns>フィボナッチ数列の文字列</returns> private string InfiniteFibpnacciZip() { string src = "def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y))); fib(0, 1)"; Prog prog = MonParser.ParseProg(src); return string.Join(", ", prog.Eval().Take(GetCount())); }
結果は以下のようになります。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181





