以下
[self.table reloadData]
具有所需的短路特性(&&) :: 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
之后,我是否真的可以确定匹配(True,False)
是否会被中止?
答案 0 :(得分:15)
是的,保证评估表达式both (False, undefined)
不会发散,因为数据构造函数的匹配保证从构造函数的组件从左到右匹配,并且模式会在某些子代数时失败模式失败。由于元组的第一个元素是False
,因此只要第一个元素无法匹配,两个(True, ...)
分支的模式就会失败。
根据Haskell 2010 Report, section 3.17.2,它给出了模式匹配的非正式语义:
- 将模式 con pat1 ... patn 与值匹配,其中 con 是由数据定义的构造函数,取决于值:
醇>
- 如果值的格式为 con v1 ... vn ,则子模式从左到右与数据值的组件匹配;如果所有匹配成功,则整体匹配成功;第一个失败或分歧导致整体匹配失败或分歧。
- 如果值的格式为 con'v1 ... vm ,其中con是与 con'不同的构造函数,则匹配失败。
- 如果值为⊥,则匹配会发散。
由于元组语法只是数据构造函数的特例语法糖,因此适用。
有关模式匹配的更全面处理,请参阅section 3.17.3 of the Haskell 2010 Report,它给出了模式匹配的形式语义(具体来说,图3.2与此问题有关)。
另一个感兴趣的资源是论文Pattern-driven Reduction in Haskell,它将语义指定为Haskell具体语法的抽象语法表示的解释器(用Haskell编写)(图3中的函数mP
,第7页与问题有关。)