再帰定義でないYコンビネータ

Haskellで出来なかったことをPureでリベンジその2
再帰を使わずにYコンビネータを定義する

404 Blog Not Found:Y combinator is forbidden in Haskell!?
ところがぎっちょんぎっちょんちょん。これが出来ないのです。

ch_y = \ f -> (\ x -> f (x x)) (\ x -> f (x x))
http://blog.livedoor.jp/dankogai/archives/50463152.html

とりあえずそのまま書いてみる。

> y f = (\x -> f (x x)) (\x -> f (x x));
> fact0 f n = if n==0 then 1 else n*f(n-1);
> y fact0 4;

しかし、unknown software exceptionで落ちる。
そこで、後ろの項に遅延評価させるための&を追加。

> y f = (\x -> f (x x)) (\x -> f (x x)&);
> fact0 f n = if n==0 then 1 else n*f(n-1);
> y fact0 4;
24

できた。
ちなみに、組み込みのfixはHaskellと同じく再帰で定義してた。

> show fix
fix f = f (fix f&);