nobsun です。

ML はようわからんのですが :-)
Haskell では、まんまですねぇ

y :: (a -> a) -> a
y f = f (y f)

fact = y (\ f n -> if n == 0 then 1 else n * f (n-1))

としておいて、実行すると

Main> fact 10
3628800

> X = (X -> (int -> int)) であるようなデータ型を用いて
> (int -> int)上の汎関数の不動点を得る方法で factorial を定義
> する以下のような ML でのプログラム例があるのですが Haskell
> ではどう書けばよいでしょうか。最初の datatype 辺りの書き方が
> わかりません。
> 
> datatype X = psi_inv of X -> (int -> int);
> fun psi (psi_inv (f)) = f;
> (* psi: X -> (X -> (int -> int)),
>    psi_inv: (X -> (int -> int)) -> X *)
> 
> fun fixpoint(g) =
>   let fun h(y) = g(fn x => psi(y)(y)(x))
>    in h(psi_inv(h))
>   end;
> (* fixpoint : ((int -> int) -> (int -> int)) -> (int -> int) *)
> 
> fun F(f)(n) = if n=0 then 1 else n * f(n-1);
> (* F: (int -> int) -> (int -> int) *)
> 
> val factorial = fixpoint(F);
> (* factorial: int -> int *)
> 
> factorial(10);
> (* 10! = 3628800 *)

--nobsun

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/