我一直在尝试确保使用ghc-heap-view包及其提供的utils的Haskell程序的内存模型的严格性,当我发现HashMap插入序列中的s似乎不在NF中时, 。我尝试打印堆树,的确显示出一些问题。然后,我尝试了另一种插入元素的方式(使用union和singleton),但这次严格了。
有人可以解释为什么会这样,并建议我是否可以做些什么来使insert行为与其他方法相同?
这是我的测试代码:
module Main where
import Control.Exception (evaluate)
import Data.Foldable
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HM
import GHC.HeapView
test1 :: HashMap Int Int
test1 = foldl' (\m v -> HM.insert v v m) HM.empty [0..5]
test2 :: HashMap Int Int
test2 = foldl' (\m v -> HM.union (HM.singleton v v) m) HM.empty [0..5]
main :: IO ()
main = do
putStrLn "HeapTree for test1"
t1 <- evaluate test1 …Run Code Online (Sandbox Code Playgroud)