以下
(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True
具有所需的短路特性False && undefined ≡ False
。第一个子句在正确的参数中是非严格的,保证在尝试其他任何内容之前进行检查。
显然,如果我更改订单甚至取消功能,它仍然有效
both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False
Prelude> both (False, undefined)
False
但这实际上是由标准保证的吗?与子句的顺序不同,模式的评估顺序在这里不是很清楚。我真的可以确定在 snd 元素被评估之前,(True,False)
一旦确定匹配就会被中止吗?(False,_)