Simon Marlow 在他的《Haskell 中的并行和并发编程》一书中写道:
插入操作有这一行:
putMVar m (Map.insert name number book)
这会将未计算的表达式放在 MVar 中
Map.insert name number book
。如果我们要连续执行许多插入操作,MVar 将建立一个大的未计算表达式链。为了获得短暂的锁定并且没有空间泄漏,我们需要使用一个技巧:let book' = Map.insert name number book putMVar m book' seq book' (return ())
使用这个序列,我们在 MVar 中存储了一个未计算的表达式,但它在 putMVar 之后立即被计算。
我不明白。操作以弱头范式seq a b
进行评估。a
所以会有未评估的表达。正如我所看到的,只有 Map 构造函数将被评估,并且它的所有内容都将被取消评估。