Yコンビネーターの必要性がいまいち
会社にて、教育担当だった方から、「遅延評価のλ計算のシミュレーター作ったからやっとけ(そうとう意訳)」というメールが来ていたので、ちょっとそのチュートリアルを読む。
で、チュートリアルの応用編と書かれた部分で、Yコンビネーターについての部分がでてきた。ついこないだ、コンビネーターよく知らんみたいなことを言っていたので、ちょっとタイムリーだと思って、よく読んでみたんだけど、名前の無いλ式だけで再起関数を定義するためのものみたいなのね。
Y = λ(f).(λ(x).f(x(x)))(λ(x).f(x(x)))
この式だけ見ていて、左辺にでてきた変数を右辺にださないようにして再起するための方法だと思っていました。
で、Haskellでこれを表現しようとすると、x(x)を実行するためには、xの型があいまいになってしまうので、表現ができない。ただ、こういう風に定義はできる。
y x = x ( y x)
このyとxの型を考えると、
y :: ( a -> b ) -> a -> b x :: a -> b
となるのかな。
なんか、 ちゃんとさわったことのある関数型がHaskellぐらいなので、λとifで無理に再起させるよりも、whereとパターンマッチで内部関数と停止条件作った方が理解しやすく感じちゃうんだよなぁ。
Lispだとありがたみがあるのかなぁ。でも、On LispでCommon Lispユーザーは、labelsやalamdaの方を便利に感じるとかかかれてるしなぁ(P394)