Mik*_*cki 26 haskell lazy-evaluation
我在Haskell中进行懒惰评估的困难之一是难以推断内存使用情况.我认为复制thunk的能力会让我更容易.这是一个例子.
让我们创建一个非常大的列表:
let xs = [1..10000000]
Run Code Online (Sandbox Code Playgroud)
现在,让我们创建一个不好的函数:
bad = do
print $ foldl1' (+) xs
print $ length xs
Run Code Online (Sandbox Code Playgroud)
没有优化,这会占用几十MB的内存.垃圾收集器在折叠期间不能解除分配xs,因为稍后需要计算长度.
是否有可能重新实现此功能:
good = do
(xs1,xs2) <- copyThunk xs
print $ foldl1' (+) xs1
print $ length xs2
Run Code Online (Sandbox Code Playgroud)
现在,xs1和xs2将表示相同的值,但在内存中也相互独立,因此垃圾收集器可以在折叠期间解除分配以防止内存浪费.(我认为这会稍微增加计算成本吗?)
显然在这个简单的例子中,重构代码可以很容易地解决这个问题,但似乎并不总是很明显如何重构.或者有时重构会大大降低代码清晰度.
Joa*_*ner 20
我不久前想知道同样的事情,并创建了这种thunk-duplication函数的原型实现.您可以在我的预印本" dup - 在haskell中显式取消共享 "中阅读结果,并在http://darcs.nomeata.de/ghc-dup上查看代码.不幸的是,该论文今年既未被Haskell研讨会所接受,也未被Haskell实施者研讨会所接受.
据我所知,这个问题没有现实世界的解决方案; 只有脆弱的解决方法作为单元参数技巧可能会因一个或其他编译器优化而中断.