[英]Is it possible to write down a sharing fix point-free?
編輯:這篇文章中的fix
代表通常寫在 Haskell 中的定點組合,而不僅僅是Data.Function.fix
。
眾所周知, fix
可能是非共享的,因為 GHC 並不總是消除常見的子表達式:
使用S
-combinator 可以很容易地無點寫下fix
:
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 = fx in x
它使用了 ~54,5 kB,而使用fix = ($) <*> fix
- ~615 kB。
是否可以以某種方式編寫共享無點fix
?
不, let
是 GHC 分享事物的提示, let
需要一個點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.