Почему функция, вводящая строгость, называется 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 был переименован в ($!).

Другие вопросы по тегам