【发布时间】:2019-02-20 00:32:25
【问题描述】:
Haskell 模式匹配通常是严格的,例如,f (x:xs) = ...
需要将输入列表评估为 (thunk : thunk)。但有时不需要这样的评估,并且函数可以对某些参数不严格,例如f (x:xs) = 3。
理想情况下,在这种情况下,我们可以避免评估参数以获得const 3 的行为,这可以通过无可辩驳的模式来完成:f ~(x:xs) = 3。这为我们带来了性能优势和更大的容错能力。
我的问题是:GHC 是否已经通过某种严格性分析实现了此类转换?如果您也可以指出一些关于它的读物,请不胜感激。
【问题讨论】:
-
我不确定,但我很确定它不会尝试这样做。无可辩驳的模式存在是有原因的。这个原因是您展示的两个定义之间的语义差异,正如您所描述的那样。 AFAIK 严格性分析旨在减少惰性并尽早执行不可避免的计算,如果可以证明它不会改变语义。但这些只是我的预感和印象。也许仔细阅读the Report 会提供更明确的答案。
-
如果我们把这个推理发挥到极致,我们也应该将
seq x y“优化”为y,这将违背seq的目的。原则上,严格模式可以用作seq的特例。 -
~ 改变了函数的语义,所以 ghc 没有这样做。
标签: haskell semantics strictness