我知道我可以这样写SML中的y-combinator,如下所示: 首先声明一个新的数据类型来绕过由于圆形造成的类型不匹配。 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)
Ÿ - Combinator的 我一直在努力学习绕Y - 组合子(上的解释是可爱的,以及)从这个跨越一个例子来了。关于这个主题的深入解释在Haskell或者Python中都是非常赞赏的。 Pleaaase! 代码 fix :: (a -> a) -> a
fix f = f (fix f)
问题 调用的函数返回fix时9是fix应用于(\x -> 9),我不知道为什么;当我沿着堆栈看时,
我想了解OCaml中的Y组合器。我从here获取了一些代码,我正在尝试使用它来编写Ackermann函数。在链接的例子中,这些函数只需要一个参数。 Ackermann函数需要两个参数,并且因为它而一直存在语法错误。我到目前为止的代码是 type 'a mu = Roll of ('a mu -> 'a);;
let unroll (Roll x) = x;;
let fix f = (fu
我建立了一个Y型组合子在JS这样 const y = f => { const g = self => x => f(self(self))(x); return g(g);}
,我简化了这样 const y = f => { const g = self => f(self(self)); return g(g);}
此得到无限递归的代码。 这两个版本有什么区别?