6

SML で y コンビネータを次のように記述できることはわかっています。最初に新しいデータ型を宣言して、循環性による型の不一致を回避します。

datatype 'a mu = Roll of ('a mu -> 'a)
val unroll = fn Roll x => x

これで、y コンビネータを簡単に定義できます。

val Y = fn f => (fn x => fn a => f (unroll x x) a)
          (Roll (fn x => fn a => f (unroll x x) a)))

これで完了です。次のように使用できます。

val f = Y (fn f => fn n => if n = 0 then 1 else n * f (n-1))

私の質問は: SML で y コンビネーターを実装する他の方法はありますか?

4

1 に答える 1