【发布时间】:2021-05-13 13:13:59
【问题描述】:
Simon Marlow 在他的《Haskell 中的并行和并发编程》一书中写道:
插入操作有这一行:
putMVar m (Map.insert name number book)这会将未计算的表达式
Map.insert name number book放在 MVar 中。 如果我们要连续执行许多插入操作,MVar 将建立一个大的未计算表达式链。 为了获得短暂的锁定并且没有空间泄漏,我们需要使用 一个技巧:let book' = Map.insert name number book putMVar m book' seq book' (return ())通过这个序列,我们在 MVar 中存储了一个未计算的表达式,但它在 putMVar 之后立即被计算。
我不明白。 seq a b 操作以弱头正常形式评估 a。所以会有未评估的表达。正如我所看到的,只有 Map 构造函数会被评估,而它的所有内容都不会被评估。
【问题讨论】:
标签: haskell concurrency lazy-evaluation weak-head-normal-form