psq*_*uid 9 haskell lazy-evaluation
我理解seq函数以及为什么有必要引入严格的效率。我不明白的是,为什么这个原语被称为seq
(而不是与严格有关)?
TL;DR:Miranda 称它为seq
,它是在sequence
(可能)已经是 Monads 的东西时引入的,并且($!)
被称为strict
很短的时间。
seq
之所以这么叫是因为它是seq
在Miranda和以前的语言中调用的,至少根据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
已经不在图片中了,让我们来看看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)
Run Code Online (Sandbox Code Playgroud)
既Eval
没有strict
也没有按原样切入 Haskell98。相反,Eval
被完全删除,因为它以任何方式应用于所有类型,strict
并被重命名为($!)
.