OCaml では Y が書けないのはデマではありません。
OCaml はイカレタ言語なので the Y combinator が書けません:
$ ocaml Objective Caml version 3.11.2+ocamlspotter # let y = fun f -> (fun x -> f (x x)) (fun x -> f (x x));; Characters 32-33: let y = fun f -> (fun x -> f (x x)) (fun x -> f (x x));; ^ Error: This expression has type 'a -> 'b but an expression was expected of type 'a
出来ません…残念です…。清く正しい OCaml プログラマはこれ以上悪あがきしません!! 書けない物は書けない、そういうことだ!!
なんと Haskell はイカシタ言語なので the Y combinator が書けるんだそうです。まじでビックリしてしまいました。書けないというのはウソだったり、勉強が足りないそうです。そう言われたら嫌が応にも Haskell やりたくなっちゃうよね!!うまいねー。
OCaml ユーザーも OCaml の欠点ばかりあげつらって内輪受けしてないで、多少ハッタリをかました方がいいのかもね!!
OCaml は今大人気の Haskell で知られる純粋関数型言語に、利便性の高い副作用と、Scala などでも使われているプログラムのモジュール化に有効なオブジェクト指向を付け加えた超純粋関数型言語です。強い型付けのある関数型言語では普通は書けない Y コンビネータも、OCaml では、再帰や -rectypes、Obj.magic、バリアントなど種々の方法を使えば簡単に「実装」できるだけでなく、「モナドは単なる自己関手の圏におけるモノイド対象にすぎない」などという呪文を唱えなくても使えるようになっています。
この話を同僚にしたら、お前ら暇やなと言われました。
おまけ:
... This implementation of a fixed point combinator in Haskell is sometimes referred to as defining the Y combinator in Haskell. This is incorrect because the actual Y combinator is rejected by the Haskell type checker[4] (but see the following section for a small modification of Y using a recursive type which works). ...
http://en.wikipedia.org/wiki/Fixed_point_combinator#Implementing_fixed_point_combinators
まあ一番うまいのは、最初に Haskell って名前の癖に Curry's Y が書けんとは残念ですねと言ったオジサンですね!!
補足: Y は不動点演算子の一つでしかありません。Z などの別の不動点演算子を書いておいて、これで Y が書ける、というのは勇み足の議論です。また、妙なテクニックを使って Y に似たものを作って Y だ、というのもいただけない。それはやっぱり Y じゃないだろ。