【发布时间】:2014-12-28 16:02:15
【问题描述】:
我目前对 Haskell 中模式重叠的理解是,如果传递给函数的某些参数值可以被多个模式匹配,则认为 2 个模式是重叠的。
给定:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
传递参数值 [1] 将匹配第一个模式 [x] 和第二个模式 (_ : xs) - 这意味着即使两个模式都可以匹配,函数也有重叠的模式。
令人困惑的是,尽管模式(根据上述定义)重叠,但 GHC 并未显示任何关于它们重叠的警告。
还原 last 函数中的 2 个模式匹配确实会显示重叠警告:
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 就好像认为模式重叠。
判断一个函数是否有重叠模式的正确方法是什么?
更新
我正在寻找 fp101x 课程中使用的overlapping pattern 定义。
根据fp101x中使用的定义,下面的函数有overlapping patterns:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
这与overlapping pattern 的 GHC 定义相矛盾,后者不认为它具有任何重叠模式。
如果没有正确定义 overlapping pattern 在 fp101x 课程上下文中的含义,就不可能解决该练习。而且那里使用的定义不是 GHC 的。
【问题讨论】:
-
GHC 在实际检测到“模式包含”时会发出“模式重叠”警告 - 正是当模式中的一个案例变得无法访问时,因为它只涵盖之前案例中已经处理过的值。
-
@chi:这就是 GHC 认为的
pattern overlapping。第一个函数定义似乎也被认为是pattern overlapping。pattern overlapping是什么有正式的定义吗? -
从您的描述来看,他们似乎不希望有任何重叠。然后你可以做一些事情,比如使用模式
last _:x:xs = last (x:xs); last [x] = x或使用守卫。
标签: haskell pattern-matching overlapping-matches