元组爆炸模式

时间:2011-06-28 15:58:21

标签: haskell pattern-matching

我理解为:

f x = x + 1 where !y = undefined

爆炸模式的含义是在y之前评估f

类似地:

f x = x + 1 where !(!a, !b) = (undefined, undefined)

含义相同,w.r.t xy

但爆炸模式意味着什么:

f x = x + 1 where (!a, !b) = (undefined, undefined)

似乎没有导致未定义的评估。 In-tuple爆炸模式什么时候开始生效?如果强制模式的元组?任何人都可以提供(!a, !b) = (..)(a, b) = (..)不同的示例吗?

2 个答案:

答案 0 :(得分:10)

元组本身的爆炸模式将强制评估元组而不是元素。无论何时评估元组本身,元组元素上的Bang模式都会强制它们。

以下是不同行为的示例:

Prelude> let x = a + 1 where (a, b) = (1, undefined)
Prelude> x
2
Prelude> let x = a + 1 where (!a, !b) = (1, undefined)
Prelude> x
*** Exception: Prelude.undefined

答案 1 :(得分:4)

如果您将其翻译为let

f x = let (!a, !b) = (undefined, undefined) in x + 1

在这里,您创建一个包含(a, b)的元组,在评估元组时,ab都是。

但是因为永远不会评估元组,所以ab都不是。这与写作基本相同:

f x = let y = undefined `seq` 4 in x + 1

由于永远不会评估y,因此undefined也不会。