haskell - 为什么引入严格性的函数称为 seq?
问题描述
我了解seq函数以及为什么有必要引入严格的效率。我不明白的是,为什么要调用这个原语seq
(而不是与严格性有关)?
解决方案
TL;DR:Miranda 称之为它seq
,它是在sequence
(可能)已经是 Monads 的东西时被引入的,并且在短时间内($!)
被称为。strict
米兰达是第一个
之所以这样称呼它,是seq
因为它seq
在米兰达和以前的语言中被称为,至少根据Paul Hudak、John Hughes、Simon Peyton Jones 和 Philip Wadler的 A History of Haskell: Being Lazy With Class。
seq
出于同样的原因(Turner,1985),数据结构的严格组件已经存在于 Miranda 中,并且seq
自 1980 年代初以来确实已用于修复惰性程序中的空间泄漏(Scheevel,1984;Hughes,1983 )
请注意,Turner 仅在 1985 年的论文中介绍了严格组件,而不是seq
其本身,而且 Scheevel 的“NORMA Sasl 手册”似乎已丢失或至少无法在 Internet 上获得。休斯的论文(上面的“休斯,1983”)也没有介绍seq
。
无论哪种方式,seq
它都是 Mirandas 标准环境的一部分,并且还包含了为什么它被调用的提示seq
:
`seq' 应用于两个值,返回第二个但检查第一个值是否完全未定义。有时需要,例如确保交互式程序中的正确同步。
正确的同步或排序。
其他可能的名称
现在,为什么不在strict
Haskell 中简单地调用它?甚至sequence
?
好吧,事实证明,引入的Haskell 1.3也确实引入了,因此seq
也引入了。因此,不能用作名称。Monad
sequence :: Monad m => [m a] -> m ()
sequence
现在sequence
已经不在画面中了,让我们来看看strict
。strict
包含在 1.3 中,因为 1.3引入了Eval
typeclass:
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
并重命名为($!)
.
推荐阅读
- laravel-migrations - 为什么在迁移表时出现无法添加外键约束错误?
- r - 包含情绪的 GloVe 词嵌入?
- css - 如何在导航栏文本后换行
- windows - 使用 AWS Managed AD 设置 LDAPS 时出错 - 无法下载
- mysql - laravel6 无法提交表单
- python - 如何从python调用节点函数,反之亦然
- javascript - 如何在 nuxt 插件中访问全局 mixin?
- hyperledger-fabric - 无法调用链码
- html - 有没有办法改变 django/html 中的日期格式?
- python - pyparsing如何访问解析结果中的重复模式