自由モノイドプログラミング言語の作成(MonIter C#スタイル版 バージョン1.2 (2))
フィボナッチ数列の例
フィボナッチ数列の例を遅延評価ができるように書き直すと以下のようになります。
型 eint が使えるようにします。
using eint = System.Collections.Generic.IEnumerable<int>;
以下の関数を定義しておきます。
private eint zipsum(eint mon1, eint mon2) => mon1.Zip(mon2, (x, y) => x + y); private eint tail(eint x) => x.Skip(1); private eint concat(int x, eint y) => new[] { x }.Concat(y);
引数で渡すバージョン
eint fib(int x, int y) { foreach (int n in concat(x, fib(y, x + y))) { yield return n; } }
Zip を使うバージョン
eint fib(int x, int y) { foreach (int n in concat(x, concat(y, zipsum(fib(x, y), tail(fib(x, y)))))) { yield return n; } }





