No orz No Life

よろしくお願いします。

ErlangとY combinator

2010年12月22日 12時58分18秒 | 日記
前回のエントリでfact(階乗)を作りましたが、書き始める前にErlang Shellで書いてみるか...と思い、Fact = fun(X) -> ... と書きだしたものの、あ、できないじゃん、と気付きました。無名関数で自分自身を呼ぶ再帰なんて書けるんでしょうか?

その日の夜に、新山さんのY combinatorの謎を偶然見ていて、途中まで油汗を流しながら聞いていたものの(よく理解できない)、後半「無名関数で再帰するサンプル」としてまさにこの階乗が出てきました。Y combinatorというのは名前はよく聞いていたものの何のために使うのかがいまひとつ分からなかったのですが、これを見てようやく使いかたが分かりました。

ErlangでY combinatorというと、MLに投稿されたものが見つかります。その後の議論がいまひとつ理解できないのですが、実際にClementson's Blogで紹介されている通り、以下のように階乗をfunで書くことができるようになりました。(まるで作り話のような展開ですが本当なので仕方ありません。)

2> ycombinator:y(fun (F) -> fun (0) -> 1; (N) -> N * F(N-1) end end).
#Fun<erl_eval.6.13229925>
3> F1 = ycombinator:y(fun (F) -> fun (0) -> 1; (N) -> N * F(N-1) end end).
#Fun<erl_eval.6.13229925>
4> F1(10).
3628800
5> (ycombinator:y(fun (F) -> fun (0) -> 1; (N) -> N * F(N-1) end end))(10).
3628800


うーん、すごいですね!


という記事を投稿するのにえらい苦労しました。どうやら私の書いてる本文によくないところがあるようで、「投稿する」を押しても完了画面が出てこないし...断片的に投稿しなおしたらどうやらコード書いてる部分がよくないようで、ここを入れた瞬間に投稿結果が空になってしまいました。プレビューでは見えるのになんで? 今は見える状態になっていますが(preやめた)正しいのかどうかは分からないままです。