我知道可以这样在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组合子的方法?