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 x
和y
.
但爆炸模式意味着什么:
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)
如果你把它翻译成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
。