为什么严密性引入函数叫seq?

问题描述 投票:5回答:1

我理解 序号 函数,为什么要引入严格性来提高效率。我不明白的是,为什么这个基元叫做 seq 而不是和严格性有关)?

haskell lazy-evaluation
1个回答
8
投票

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 已改名为 ($!).

© www.soinside.com 2019 - 2024. All rights reserved.