Y Combinatorが凄すぎる!

って言いたかったけど、難しくて理解できません><

ラムダの話をしてたら会社の人が、Recursive lambda expressions – The Mellow Musings of Dr. Tの説明をしてくれました。
去年の秋にブクマで見たときは難しそうだからスルーしたけど、、今回は理解しようと頑張って見てみます。

やっぱり理解はできないorz

でも、ここで諦めたら負けなので、とりあえず触ってみました。

昔、書いてみたフィボナッチ数列で試してみる


public static void Main()
{
foreach (var item in Math.Fib(10))
Console.WriteLine(item);
}
static public class Math
{
static public IEnumerable<int> Fib(int count)
{
Func<int, int> f = null;
f = i => (i < 2) ? 1 : f(i - 1) + f(i - 2);
foreach (int i in Enumerable.Range(0, count))
yield return f(i);
}
}

ここの部分↓

Func<int, int> f = null;

この初期化と同時に入れられないのが、悔しいなーで終わってたんですが、、
どうも、Y Combinatorってやつはそれを解消できるらしい!!

これがY Combinatorらしいです


static Func<T, T> Fix<T>(Func<Func<T, T>, Func<T, T>> F)
{
return t => F(Fix(F))(t);
}

で、こうなりました。


static public IEnumerable<int> Fib(int count)
{
foreach (int ii in Enumerable.Range(0, count))
yield return Fix((Func<Func<int, int>, Func<int, int>>)(ff => i => ((i < 2) ? 1 : ff(i - 1) + ff(i - 2))))(ii);
}

これすっっげぇ・・(゜゜

で、でも使い方あってんのかわかんない;
キャスト長いけど、どっか別のところに入れたら推論できないのかな・・・

これで終わり

とりあえずは、これ以上は追わない。

それよりも純粋に関数型言語をやってみたいからF#をやってみます^^

関数型言語再帰とか簡単だし、C#で大変なことが簡単にできるのはやっぱすごいなー

let rec! let rec!