【发布时间】:2016-01-08 09:32:25
【问题描述】:
我对 Haskell 的 seq 如何在 tutorial I'm reading 中工作的描述感到困惑。
教程指出
评估表达式
seq x y将首先将x评估为WHNF,然后才继续评估y
但在前面的同一篇教程中,在解释 Haskell 的惰性求值一般如何工作时,指出在求值函数时,arguments 是“求值的,但仅在必要时”,这意味着它的
参数将从左到右进行评估,直到它们的最上面的节点是匹配模式的构造函数。如果模式是一个简单变量,则不计算参数;如果模式是构造函数,这意味着对 WHNF 的评估。
一般来说,这个函数评估的描述似乎与seq 的描述没有什么不同。两者——在我的初学者阅读中——只是将他们的第一个论点简化为 WHNF。
正确吗? seq 与任何其他 Haskell 函数有何不同——特别是它处理第一个参数的方式?
【问题讨论】:
-
@Heinrich Apfelmus:关于laziness tutorial 的问题。
-
嗯...一个说“除非需要,否则不会评估该参数”,另一个具体说“这将被评估为 WHNF”。你觉得这在什么方面是一样的?
-
@Cubic:当然,在各个方面;这就是我问清楚的原因。 (滴,滴)如果您阅读整个教程(用初学者的眼光,谢谢),您会发现“需要”可能是关键但未明确阐述的区别。
-
第二个引用的第一句片段可以说是模棱两可的(“他们的最顶层节点”是指每个参数的单个最顶层节点,还是每个参数顶部的一些不确定数量的节点?在事实上,后者。)但是“如果模式是一个简单的变量,那么参数就不会被评估”对我来说似乎很明确......
-
也许我们只是不明白您的问题是什么?确实
seq和(&&)的文本示例都将它们的第一个参数简化为WHNF。然而,这并非对所有 Haskell 函数都适用。例如one x = 1根本不会评估它的论点。同样,notseq x y = y永远不会评估x,因为这样做对于生成值y不是必需的。