模式匹配中的评估顺序是否有任何保证?

时间:2016-10-30 12:06:46

标签: haskell pattern-matching strictness

以下

[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)是否会被中止?

1 个答案:

答案 0 :(得分:15)

是的,保证评估表达式both (False, undefined)不会发散,因为数据构造函数的匹配保证从构造函数的组件从左到右匹配,并且模式会在某些子代数时失败模式失败。由于元组的第一个元素是False,因此只要第一个元素无法匹配,两个(True, ...)分支的模式就会失败。

根据Haskell 2010 Report, section 3.17.2,它给出了模式匹配的非正式语义:

  
      
  1. 将模式 con pat1 ... patn 与值匹配,其中 con 是由数据定义的构造函数,取决于值:      
        
    • 如果值的格式为 con v1 ... vn ,则子模式从左到右与数据值的组件匹配;如果所有匹配成功,则整体匹配成功;第一个失败或分歧导致整体匹配失败或分歧。
    •   
    • 如果值的格式为 con'v1 ... vm ,其中con是与 con'不同的构造函数,则匹配失败。
    •   
    • 如果值为⊥,则匹配会发散。
    •   
  2.   

由于元组语法只是数据构造函数的特例语法糖,因此适用。

有关模式匹配的更全面处理,请参阅section 3.17.3 of the Haskell 2010 Report,它给出了模式匹配的形式语义(具体来说,图3.2与此问题有关)。

另一个感兴趣的资源是论文Pattern-driven Reduction in Haskell,它将语义指定为Haskell具体语法的抽象语法表示的解释器(用Haskell编写)(图3中的函数mP,第7页与问题有关。)