Haskell中模式匹配评估的顺序

Dan*_*iel 1 haskell

采取两个相似的功能:

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]
Run Code Online (Sandbox Code Playgroud)

使用ghc编译时,结果是可预测的:

True

False

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

dup*_*ode 10

它在语言本身中定义.Haskell Report 2010的第4.4.3.1小节规定函数定义中的子句等同于案例表达式.反过来,案例表达式按顺序排列.引述报告第3.13节:

通过将表达式e与各个备选方案匹配的模式来评估案例表达式.从上到下依次尝试替代方案.