Почему вводящая строгость функция называется seq? - PullRequest
8 голосов
/ 28 апреля 2020

Я понимаю функцию seq и почему необходимо ввести строгость для эффективности. Я не понимаю, почему этот примитив называется seq (а не что-то, что связано со строгостью)?

1 Ответ

8 голосов
/ 28 апреля 2020

TL; DR: Миранда назвала это seq, оно было введено, когда sequence было (вероятно) уже для Монад, и ($!) было известно как strict на короткое время.

Миранда была первой

Она называется seq, потому что она называлась seq в Миранда и предыдущих языках, по крайней мере, согласно История Haskell: быть ленивым с классом Пола Худака, Джона Хьюза, Саймона Пейтона Джонса и Филипа Уодлера .

И seq, и строгие компоненты структур данных уже присутствовали в Миранда по тем же причинам (Turner, 1985) и действительно seq использовалась для исправления утечек в ленивых программах с начала 1980-х годов (Scheevel, 1984; Hughes, 1983)

Обратите внимание, что Тернер представил строгие компоненты только в статье 1985 года , а не seq, а «Руководство НОРМА Sasl» Шивеля, похоже, потеряно или, по крайней мере, недоступно в Inte rnet. Тезис Хьюза («Hughes, 1983» выше) также не представляет seq.

В любом случае, seq был частью стандартной среды Мирандаса , а также содержит подсказку, почему он был вызван seq:

`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 был переименован в ($!).

...