豊福です。

  質問しっぱなしが残っているのに(近いうちに続きを書きますので
ご勘弁を)新しい質問ですみません。

  「自己言及の論理と計算」
http://www.kurims.kyoto-u.ac.jp/~hassei/selfref.pdf に
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 *)
---
                        豊福
                        nobu_toyofuku / nifty.com


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