为什么引入严格的函数称为 seq?

psq*_*uid 9 haskell lazy-evaluation

我理解seq函数以及为什么有必要引入严格的效率。我不明白的是,为什么这个原语被称为seq(而不是与严格有关)?

Zet*_*eta 8

TL;DR:Miranda 称它为seq,它是在sequence(可能)已经是 Monads 的东西时引入的,并且($!)被称为strict很短的时间。

米兰达是第一个

seq之所以这么叫是因为它是seqMiranda和以前的语言中调用的,至少根据Paul Hudak、John Hughes、Simon Peyton Jones 和 Philip Wadler 的A History of Haskell: Being Lazy With Class

无论seq和严格的数据结构的组件中已经存在米兰达出于同样的原因(特纳,1985),而事实上seq自从20世纪80年代初(Scheevel,1984;休斯,1983年)已经习惯了在偷懒程序修复空间泄漏

请注意,Turner 在 1985 年的论文中只介绍了严格的组件,而不是seq其本身,而且 Scheevel 的《NORMA Sasl 手册》似乎已丢失或至少在互联网上找不到。Hughes 论文(上面的“Hughes, 1983”)也没有介绍seq

无论哪种方式,seq都是 Mirandas 标准环境的一部分,并且还包含一个提示,为什么它被称为seq

`seq' 应用于两个值,返回第二个但检查第一个值是否完全未定义。有时需要,例如确保交互式程序中的正确同步。

正确的同步或SEQ uencing。

其他可能的名称

现在,为什么不简单地strict在 Haskell 中调用它?甚至sequence

好吧,事实证明,引入 的Haskell 1.3seq确实也引入了Monad,因此sequence :: Monad m => [m a] -> m (). 因此,sequence不能作为名称使用。

现在sequence已经不在图片中了,让我们来看看strictstrict已包含在 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)
Run Code Online (Sandbox Code Playgroud)

Eval没有strict也没有按原样切入 Haskell98。相反,Eval被完全删除,因为它以任何方式应用于所有类型,strict并被重命名为($!).