我目前对 Haskell 中模式重叠的理解是,如果传递给函数的某些参数值可以与多个模式匹配,则认为 2 个模式是重叠的。
鉴于:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
传递参数值 [1] 将匹配第一个模式 [x] 和第二个模式 (_ : xs) - 这意味着即使两个模式都可以匹配,函数也具有重叠的模式。
令人困惑的是,尽管模式(根据上面的定义)是重叠的,但 GHC 没有显示任何关于它们重叠的警告。
还原函数中的 2 个模式匹配last
确实会显示重叠警告:
last :: [a] -> a
last (_ : xs) = last xs
last [x] = x
警告:
src\OverlappingPatterns.hs:6:1: Warning:
Pattern match(es) are overlapped
In an equation for `last': last [x] = ...
如果先前的模式无法匹配后来出现的模式,则几乎就像 GHC 认为模式重叠一样。
确定函数是否具有重叠模式的正确方法是什么?
更新
我正在寻找overlapping pattern
fp101x 课程中使用的定义。
根据 fp101x 中使用的定义,以下函数具有overlapping patterns
:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
overlapping pattern
这与不认为它具有任何重叠模式的 GHC 定义相矛盾。
如果没有正确定义overlapping pattern
fp101x 课程上下文中的含义,就不可能解决该练习。而且那里使用的定义不是 GHC 定义的。