【发布时间】:2014-10-31 07:59:19
【问题描述】:
Haskell 报告 2010 说 seq“削弱了 Haskell 的参数属性”,因为“⊥ 与 \x -> ⊥ 不同,因为 seq 可以用来区分它们”[1]。
这似乎完全是因为一个明确的规则:
seq ⊥ b = ⊥
我想知道为什么要引入这种特殊情况? 一定是有原因的
seq a b = b
还不够,seq 需要针对这种特殊情况进行更复杂的定义:
seq ⊥ b = ⊥
seq a b = b, if a ≠ ⊥
[1]https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1260006.2
[编辑] 它澄清了问题,这是另一个角度。
为什么seq不能这样定义:
seq :: a -> b -> b
seq a b = b
seq是一个特殊函数,它会“尽可能多地”评估其第一个参数。如果评估结果为 HNF,则该参数被完全评估。如果它会导致异常或底部值,则将它们存储起来,并在第一个参数实际用于评估第二个参数时抛出或返回。
这有点蹩脚,但我认为这应该让我的问题更清楚一些。这与seq 的工作方式无关。这是关于当前设计的意图。
从实施的角度来看,也许有一些明显的原因。或者它可能会产生一些后果,比如无法提供一些当前基于 seq 的有用属性,这些属性是用底部的特殊情况定义的。
或者也许还有一些我不知道的其他联系。
这就是我好奇的地方:)
【问题讨论】:
-
也许我在这里完全是愚蠢的,但第一个只是说明 seq 在第一个参数中是严格的,这就是首先使用 seq 的重点(它将 a 评估为 HNF)跨度>
-
(顺便说一句,
⊥是否需要与\x -> ⊥区分开来实际上似乎是一个悬而未决的问题。cstheory.stackexchange.com/questions/19165/…)
标签: haskell