我一直在尝试在Haskell中编码一个需要使用大量可变引用的算法,但与纯粹的惰性代码相比,它(可能并不奇怪)非常慢.考虑一个非常简单的例子:
module Main where
import Data.IORef
import Control.Monad
import Control.Monad.Identity
list :: [Int]
list = [1..10^6]
main1 = mapM newIORef list >>= mapM readIORef >>= print
main2 = print $ map runIdentity $ map Identity list
Run Code Online (Sandbox Code Playgroud)
在我的机器上运行GHC 7.8.2,main1需要1.2秒并使用290MB内存,而main2只需0.4秒,仅使用1MB.是否有任何阻止这种增长的技巧,特别是在太空?我经常需要IORef非原始类型的s Int,并且假设一个人IORef会像常规thunk一样使用额外的指针,但我的直觉似乎是错误的.
我已经尝试了一个带有解压缩的专用列表类型IORef,但没有显着差异.