是否可以免费写下共享修订?

时间:2020-07-06 09:12:37

标签: haskell optimization ghc fixpoint-combinators

编辑:本文中的fix代表用Haskell写下的定点组合,而不仅仅是Data.Function.fix

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

Long story short: "If you care about CSE, do it by hand."

fix可以很容易地通过使用S-combinator来写下:

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,而使用fix = ($) <*> fix时,它会消耗〜615 kB。

是否可以通过某种方式写下无共享的fix

1 个答案:

答案 0 :(得分:1)

不。 let是GHC分享事物的线索,let需要一点。