Пример строгого вычисления из книги Саймона Марлоу «Параллельное и параллельное программирование в Haskell».

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


person Николай Николай    schedule 13.05.2021    source источник


Ответы (2)


Как я вижу, оценивается только конструктор Map, и все его содержимое не оценивается.

Внутри тип Map реализован с использованием строгого дерева. Либо оценивается весь корешок дерева, либо ничего. Вот фрагмент кода библиотеки:

data Map k a  = Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
              | Tip

Аннотации строгости (!) предотвращают сохранение неоцененных значений в виде поддеревьев. Итак, если мы оцениваем значение Map k a как слабую нормальную форму головы, мы фактически полностью оцениваем корешок дерева.

person chi    schedule 13.05.2021
comment
Спасибо! Перед тем как задать вопрос, мне пришлось взглянуть на исходный код карты;) - person Николай Николай; 14.05.2021

Map в Map.insert не является конструктором карты. Это имя модуля. Здесь вызывается функция insert :: Ord k => k -> a -> Map k a -> Map k a. Его результат будет оценен как WHNF до того, как return () будет вычислен в качестве следующего вычислительного шага в комбинированном действии ввода-вывода, благодаря вызову seq. Вы можете ознакомиться с источником insert для получения подробной информации. Он очень сильно пробивается сквозь узоры челки и тому подобное.

person Will Ness    schedule 13.05.2021