Haskell编写递归题目触发模式匹配不完整警告该如何解决?
问题原因
你的case表达式的模式匹配没有覆盖所有可能的输入情况,编译器警告明确提示缺失了仅含单个元素的列表[_]的匹配分支。
你当前仅覆盖了三种输入场景:
- 空列表
[] - 恰好包含两个元素的列表
[x,y] - 长度大于等于3的列表
x:y:xs
当输入为长度1的列表时没有对应的匹配逻辑,因此触发了不完整模式匹配警告。
修复方法
补充单个元素列表的匹配分支即可,仅含单个元素的列表天然满足相邻元素差不超过1的要求,直接返回True:
continuous :: [Integer] -> Bool continuous list = case list of [] -> True [_] -> True -- 新增单个元素匹配分支 [x,y] | abs (x-y) <= 1 -> True | otherwise -> False x:y:xs | abs(x-y) <= 1 -> continuous (y:xs) | otherwise -> False
可选代码简化
实际上长度为2的列表分支可以和更长的列表分支合并,因为x:y:xs在xs为空时恰好对应双元素列表,简化后逻辑完全等价,写法更简洁:
continuous :: [Integer] -> Bool continuous list = case list of [] -> True [_] -> True x:y:xs -> abs (x - y) <= 1 && continuous (y:xs)
内容的提问来源于stack exchange,提问作者Rain
相关产品推荐
相关产品推荐

