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