Саймон Марлоу в своей книге «Параллельное и параллельное программирование на 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
в нормальной форме слабого заголовка. Так что будет неоцененное выражение. Как я вижу, оценивается только конструктор карты, и все его содержимое не оценивается.