【问题标题】:Haskell does not garbage collect the head of a list?Haskell不会垃圾收集列表的头部吗?
【发布时间】:2014-11-24 08:38:31
【问题描述】:

考虑以下程序:

module Main where

import Control.Monad.List

main = runListT $ do
  x <- ListT $ return $ [0..1000000000]
  lift $ print x

理想情况下,我们希望列表在我们使用它时被垃圾收集,这样这个程序就只使用常量内存。但是当我编译并运行它时

ghc Main.hs -O2 -o Main

我看到它一直在使用越来越多的内存。如何说服 Haskell GC 列表中消耗的元素?

【问题讨论】:

    标签: performance haskell garbage-collection


    【解决方案1】:

    transformers 中的 ListT 不会在恒定空间中流式传输或运行。 pipes 中的 ListT 可以!

    import Control.Monad (mzero)
    import Pipes
    
    main = runListT (do
        x <- Select (each [0..1000000000])
        lift (print x)
        mzero )
    

    我今天也刚刚上传了pipes-4.1.4,这让runListT 放宽到最后不需要mzero,所以它只是:

    -- Requires `pipes-4.1.4`
    import Pipes
    
    main = runListT (do
        x <- Select (each [0..1000000000])
        lift (print x) )
    

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 2012-04-14
      • 1970-01-01
      • 2015-04-10
      • 2015-05-04
      • 1970-01-01
      • 2014-11-03
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多