Haskell中的模式匹配评估顺序

时间:2018-10-12 23:09:03

标签: haskell operator-precedence

采用两个外观相似的功能:

foo :: Eq a => [a] -> Bool
foo [x,y] | x == y = True
foo _ = False

bar :: Eq a => [a] -> Bool
bar _ = False
bar [x,y] | x == y = True

main = do
print $ foo [1,1]
print $ bar [1,1]

使用ghc编译时,结果可以预期:

True

False

因为评估不同模式组的顺序似乎是从上到下。我的问题是这种行为是在语言本身中定义还是仅由编译器定义?例如,如果我使用其他编译器,是否可以获得相反的结果?我想知道它是否像C / C ++一样可预测或模棱两可

1 个答案:

答案 0 :(得分:9)

它是用语言本身定义的。 Subsection 4.4.3.1 of the Haskell Report 2010指定函数定义中的子句等效于case表达式。反过来,大小写表达式的替代项按顺序匹配。引用section 3.13 of the Report

  

案例表达式是通过将表达式 e 与各个替代项进行模式匹配来评估的。从上到下依次尝试其他方法。