元组爆炸模式

Pea*_*ker 7 haskell pattern-matching

我明白在:

f x = x + 1 where !y = undefined

爆炸模式的含义y是以前要评估的f.

同理:

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

意思是一样的,wrt xy.

但爆炸模式意味着什么:

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

它似乎不会导致未定义被评估.In-tuple爆炸模式什么时候开始生效?如果强制模式的元组?谁能给其中一个例子(!a, !b) = (..)不同于(a, b) = (..)

ham*_*mar 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
Run Code Online (Sandbox Code Playgroud)


jas*_*vdj 5

如果你把它翻译成let

f x = let (!a, !b) = (undefined, undefined) in x + 1
Run Code Online (Sandbox Code Playgroud)

在这里,您创建一个包含 的元组(a, b),并且当对元组求值时, 和a都是b

但因为元组从未被评估过,所以也没有a被评估b过。这与编写基本相同:

f x = let y = undefined `seq` 4 in x + 1
Run Code Online (Sandbox Code Playgroud)

由于 y 从未被评估,因此 也未被评估undefined