在Haskell中,我试图理解严格的概念。我明白了
const x y = x
对第一个参数严格,但对第二个参数不严格。 但是
ifFun pred cons alt = if pred then cons else alt
严格?第一个论点是严格的。我理解cons和alt的评估取决于pred的值。这是否意味着函数对这些参数不严格?
答案 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
实际上是两个参数功能),因为∀y
。 const ⊥ y = ⊥
确实有效。
我们现在还有工具来解决您关于ifFun
的问题,即:第二个参数是ifFun
严格吗?也就是说,我们可以烹饪pred
和alt
这样
ifFun pred ⊥ alt ≠ ⊥ -- ?
我认为很明显我们可以这样做,因为:
ifFun False ⊥ () = if False then ⊥ else () = () ≠ ⊥
类似的论证表明,ifFun
在对这一短语的流行理解中是“对其第三个论点不严格”(再次模仿上面讨论的附带条件),但 “严格它的第一个论点是“。