Почему функция, вводящая строгость, называется seq?
Я понимаю функцию seq и почему необходимо ввести строгость для эффективности. Я не понимаю, почему этот примитив называетсяseq
(а не то что со строгостью)?
1 ответ
TL;DR: Миранда назвала это seq
, это было введено, когда sequence
был (вероятно) уже делом для Монад, и ($!)
был известен как strict
на короткое время.
Миранда была первой
Это называется seq
потому что это называлось seq
на Миранде и предыдущих языках, по крайней мере, согласно "Истории Хаскелла: ленивый класс " Пола Худака, Джона Хьюза, Саймона Пейтона Джонса и Филипа Уодлера.
Обе
seq
и строгие компоненты структур данных уже присутствовали в Миранде по тем же причинам (Turner, 1985), и действительноseq
использовались для устранения утечки пространства в ленивых программах с начала 1980-х (Scheevel, 1984; Hughes, 1983)
Обратите внимание, что Тернер только ввел строгие компоненты в статью 1985 года, а неseq
само по себе, а "Руководство по NORMA Sasl" Шеевеля кажется утерянным или, по крайней мере, недоступным в Интернете. Тезис Хьюза (см. Выше "Hughes, 1983") не вводитseq
или.
Так или иначе, seq
был частью стандартной среды Mirandas, а также содержит подсказку, почему он был вызванseq
:
"seq", примененный к двум значениям, возвращает второе, но проверяет, не является ли первое значение полностью неопределенным. Иногда требуется, например, для обеспечения корректной синхронизации в интерактивных программах.
Правильная синхронизация или последующее uencing.
Другие возможные имена
Теперь, почему это просто не было названо strict
в Haskell? Или дажеsequence
?
Что ж, оказывается, что Haskell 1.3, который представилseq
, также представил Monad
, и поэтому sequence :: Monad m => [m a] -> m ()
. Следовательно,sequence
не было доступно как имя.
Теперь, когда sequence
не было в кадре, давайте посмотрим на strict
. strict
был включен в 1.3, так как 1.3 представилEval
класс типов:
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Ни то, ни другое Eval
ни strict
не попал в Haskell98 как есть. Вместо,Eval
был полностью удален, поскольку в любом случае он относился ко всем типам, и strict
был переименован в ($!)
.