编辑:本文中的fix
代表用Haskell写下的定点组合,而不仅仅是Data.Function.fix
。
众所周知,fix
可能不会共享,因为GHC并不总是消除常见的子表达式:
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
?
答案 0 :(得分:1)
不。 let
是GHC分享事物的线索,let
需要一点。