再帰定義でない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&);