TL;DR:米兰达称之为seq
,它是在什么时候引入的sequence
(可能)已经是 Monad 的事情了,并且($!)
被称为strict
很短的时间。
米兰达是第一个
它被称为seq
因为它被称为seq
in Miranda和以前的语言,至少根据Haskell 的历史:课堂上的懒惰作者:保罗·胡达克、约翰·休斯、西蒙·佩顿·琼斯和菲利普·瓦德勒.
Both seq
出于同样的原因,数据结构的严格组成部分已经存在于米兰达(Turner,1985),并且确实seq
自 20 世纪 80 年代初以来,它一直被用来修复惰性程序中的空间泄漏(Scheevel,1984;Hughes,1983)
注意Turner在1985年的论文中只介绍了严格的成分, not seq
Scheevel 的“NORMA Sasl 手册”似乎已经丢失,或者至少在互联网上找不到。休斯论文(上面的“休斯,1983”)没有介绍seq
either.
无论哪种方式,seq是 Mirandas 标准环境的一部分并且还包含一个提示为什么它被称为seq
:
“seq”应用于两个值,返回第二个值,但检查第一个值是否完全未定义。有时需要,例如确保交互式程序中的正确同步。
正确同步或sequencing.
其他可能的名称
现在,为什么不简单地称之为strict
在哈斯克尔?甚至sequence
?
好吧,事实证明哈斯克尔 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)
Neither Eval
nor strict
没有按原样切入 Haskell98。反而,Eval
被完全删除,因为它适用于所有类型,并且strict
被重命名为($!)
.