4

编辑:fix在这篇文章中,它代表一般用 Haskell 写下的定点组合,而不仅仅是Data.Function.fix.

众所周知,fix可能是非共享的,因为 GHC 并不总是消除常见的子表达式:

长话短说:“如果您关心 CSE,请亲自动手。”

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某种方式免费写下共享点?

4

1 回答 1

1

let,是 GHC 分享事物的暗示,并且let需要一个点。

于 2020-07-06T12:13:35.780 回答