编辑:fix
在这篇文章中,它代表一般用 Haskell 写下的定点组合,而不仅仅是Data.Function.fix
.
众所周知,fix
可能是非共享的,因为 GHC 并不总是消除常见的子表达式:
fix
使用 -combinator 可以很容易地写下无点S
:
fix = ($) <*> fix
如果我们返回积分,我们将得到众所周知的非共享实现:
fix f = ($) <*> fix $ f = ($) f (fix f) = f (fix f)
我相信,在这种情况下,GHC 无法完成 CSE,因为它fix f
取决于f
第一个论点中的懒惰。事实上,正如Daniel Wagner所建议的,请看以下代码段:
let ones = fix (1:) in (ones !! 10000, ones !! 0)
fix f = let x = f x in x
它用完了〜54,5 kB,而用-〜615 kB fix = ($) <*> fix
。
是否有可能以fix
某种方式免费写下共享点?