Haskell 元组爆炸模式

Haskell 元组爆炸模式,haskell,pattern-matching,Haskell,Pattern Matching,我了解到: fx=x+1其中!y=未定义 bang模式的含义是在f之前对y进行评估 同样地: fx=x+1其中!(!a,!b)=(未定义,未定义) 意思是一样的,w.r.tx和y 但爆炸模式在以下方面意味着什么: fx=x+1,其中(!a,!b)=(未定义,未定义) 它似乎不会导致对undefined进行评估。元组内爆炸模式何时生效?如果模式的元组是强制的?有人能举一个例子,说明(!a,!b)=(…)与(a,b)=(…)不同吗?如果你把它翻译成,让它: f x = let (!a, !b) =

我了解到:

fx=x+1其中!y=未定义

bang模式的含义是在
f
之前对
y
进行评估

同样地:

fx=x+1其中!(!a,!b)=(未定义,未定义)

意思是一样的,w.r.t
x
y

但爆炸模式在以下方面意味着什么:

fx=x+1,其中(!a,!b)=(未定义,未定义)


它似乎不会导致对undefined进行评估。元组内爆炸模式何时生效?如果模式的元组是强制的?有人能举一个例子,说明
(!a,!b)=(…)
(a,b)=(…)
不同吗?

如果你把它翻译成
,让它:

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永远不会被计算,所以
未定义的

元组本身的bang模式将强制计算元组,而不是其元素。每当对元组本身求值时,元组元素上的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

我问了一个关于
的相关问题
f!(D)=…
vs
f(D)=…