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.tx
和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
我问了一个关于的相关问题[function pattern matches](]())中的code>:f!(D)=…
vsf(D)=…
。