这个问题在这里已有答案:
我有这个代码的问题,它应该计算字符串中相同字母的最长子字符串,但是有一个错误:
*** Exception: test.hs:(15,0)-(21,17):
Non-exhaustive patterns in function countLongest'
我知道这是错误的类型问题,但我不知道错误在哪里,或者如何查找或调试它
countLongest :: (Eq a) => [a] -> Int
countLongest' :: (Eq a) => Int -> Int -> [a] -> Int
countLongest a = countLongest' 0 0 a
countLongest' n max (y:x:ys)
| y == x = countLongest' (n+1) max (x:ys)
| n > max = countLongest' 0 (n) (x:ys)
| otherwise = countLongest' 0 (max) (x:ys)
countLongest' n max []
| n > max = n
| otherwise = max
2 回答
看起来你错过了有一个元素列表的情况:
这是一个类似于你的人为例子:
例子:
因此它在列表中使用0和2个元素成功,但是当只有一个元素时会失败 .
请注意,此行为对于列表是唯一的 not . 这是使用
Maybe
的示例:例子:
发生这种情况是因为
Maybe
,Just <something>
和Nothing
有两个构造函数 . 我们没有为Nothing
提供案例,所以当我们将其传递给g
时,它没有用!查看this question及其答案,以获取有关从编译器获得一些帮助的信息 . 我按照第一个答案的建议,当我加载我的例子时,这就是发生的事情:
凉!编译器非常聪明!
问题是如果递归中剩下1个元素,则需要匹配,例如:
因为如果剩下2个或更多元素,则第一个匹配,如果没有元素,则匹配最后一个匹配 .