generated at
Yコンビネータ
Haskell Brooks Curryによって発見された
Y\equivλf.(λx.f (x x)) (λx.f (x x))
無名関数で再帰を行っている



任意のラムダ抽象Mに対して以下が成り立つ
YM=_\beta M(YM)
証明
_
YM = λf.(λx.f(xx))(λx.f(xx))M = (λx.M(xx))(λx.M(xx)) -- ① = M(λx.M(xx)(λx.M(xx))) = M (YM) -- ∵ ①


参考
SKIからYを作る




Yコンビネータの引数に関数 M を与える
Y M = M (M (M (M ...))) というイメージ





YM = M(YM) の意味
M YM を適用した結果は、 M(YM) だが、これが YM に等しい
というのを繰り返すと
YM = M(YM)
YM = M(M(YM))
YM = M(M(M(M(M(M(...(YM)...))))
となる
YM M を何回適用しても YM になる

>関数にその関数自身を適用させるときにYを適用させておくと、そのまま同じものが帰ってくるので、Yを不動点演算子といいます。


Fix型でYコンビネータに型を付ける
hs

Y\equivλf·(λx·f (x x)) (λx·f (x x))
x x の部分がミソ
これは型なし言語だからこそできる記述
最初の x は適用するものだが、二番目の x は適用されるもの
なので、 x 同士で型が異なり、型が定まらない





Haskell