我理解 序号 函数,为什么要引入严格性来提高效率。我不明白的是,为什么这个基元叫做 seq
而不是和严格性有关)?
TL;DR:Miranda叫它 seq
它是在下列情况下引入的 sequence
是(可能)已经为Monads,和 ($!)
被称为 strict
短时间内。
这就是所谓的 seq
因为它被称为 seq
在 米兰达 和以前的语言,至少根据 Haskell的历史。懒惰的类 作者:Paul Hudak、John Hughes、Simon Peyton Jones和Philip Wadler。.
两者
seq
和数据结构的严格成分在Miranda中已经存在,原因相同(Turner,1985),而且实际上seq
自20世纪80年代初以来,一直被用来修复懒惰程序中的空间泄漏(Scheevel,1984;Hughes,1983)。
请注意 特纳在1985年的论文中才介绍了严格的成分,不 seq
本身,而Scheevel的 "NORMA Sasl手册 "似乎已经遗失,或者至少在互联网上找不到。Hughes的论文(上文 "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中加入了.NET技术,因为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
已改名为 ($!)
.