首页 > 解决方案 > 为什么引入严格性的函数称为 seq?

问题描述

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

标签: haskelllazy-evaluation

解决方案


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

正确的同步或排序

其他可能的名称

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

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

现在sequence已经不在画面中了,让我们来看看strictstrict包含在 1.3 中,因为 1.3引入了Evaltypeclass

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并重命名为($!).


推荐阅读