什么是严格?

时间:2017-12-09 16:35:17

标签: haskell lazy-evaluation

在Haskell中,我试图理解严格的概念。我明白了

const x y = x

对第一个参数严格,但对第二个参数不严格。 但是

 ifFun pred cons alt = if pred then cons else alt

严格?第一个论点是严格的。我理解cons和alt的评估取决于pred的值。这是否意味着函数对这些参数不严格?

1 个答案:

答案 0 :(得分:7)

“严格”是具有精确技术含义的词语之一,社区已经采用这些词语来表示一些不太正式的东西。这是技术定义。

如果f,则f ⊥ = ⊥ 严格

这里⊥是未定义计算的标准符号;通常在指称语义中只有一个并且所有未定义的计算彼此无法区分,但在Haskell中作为对实用性的让步,我们有许多可以区分的不同类型:异常,无限循环,模式匹配失败等等。出于这个答案的目的,我们将认为它们都是平等的。

让我们问一下const是否严格。我们有

const = \x -> \y -> x

因此

const ⊥ = \y -> ⊥ ≠ ⊥

因此const并不严格。但是,哦,我们在这里失去了一些非常重要的通信能力!有一种很好的意义,当应用于未定义的行为时,const表现不佳。很多人会说“在 n 论点中严格”,我们几乎可以理解他们的意思。如何正式定义它们的含义并不明显,但是对它的第一次尝试就是这样的:

如果函数f具有 m 参数,那么对于某些 n ,第n个参数中的 strict m 当∀a1,...,am。 f a1 a2 ... a(n-1)⊥a(n + 1)... am =⊥。

(旁白:为什么这不是很正确?对于许多函数 - 包括const - 我们无法静态地知道它有多少参数。虽然const看起来可能是一个双参数函数,const id () ()完全打字并将const应用于三个参数。)

现在我们可以说“const对它的第一个参数是严格的”并且它意味着我们想要的意思(如上所述,const实际上是两个参数功能),因为∀yconst ⊥ y = ⊥确实有效。

我们现在还有工具来解决您关于ifFun的问题,即:第二个参数是ifFun严格吗?也就是说,我们可以烹饪predalt这样

ifFun pred ⊥ alt ≠ ⊥ -- ?

我认为很明显我们可以这样做,因为:

ifFun False ⊥ () = if False then ⊥ else () = () ≠ ⊥

类似的论证表明,ifFun在对这一短语的流行理解中是“对其第三个论点不严格”(再次模仿上面讨论的附带条件),但 “严格它的第一个论点是“。