采用两个外观相似的功能:
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 ++一样可预测或模棱两可
答案 0 :(得分:9)
它是用语言本身定义的。 Subsection 4.4.3.1 of the Haskell Report 2010指定函数定义中的子句等效于case表达式。反过来,大小写表达式的替代项按顺序匹配。引用section 3.13 of the Report:
案例表达式是通过将表达式 e 与各个替代项进行模式匹配来评估的。从上到下依次尝试其他方法。