我理解为:
f x = x + 1 where !y = undefined
爆炸模式的含义是在y
之前评估f
。
类似地:
f x = x + 1 where !(!a, !b) = (undefined, undefined)
含义相同,w.r.t x
和y
。
但爆炸模式意味着什么:
f x = x + 1 where (!a, !b) = (undefined, undefined)
似乎没有导致未定义的评估。 In-tuple爆炸模式什么时候开始生效?如果强制模式的元组?任何人都可以提供(!a, !b) = (..)
与(a, b) = (..)
不同的示例吗?
答案 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)
的元组,在评估元组时,a
和b
都是。
但是因为永远不会评估元组,所以a
和b
都不是。这与写作基本相同:
f x = let y = undefined `seq` 4 in x + 1
由于永远不会评估y,因此undefined
也不会。