功能上的详尽模式
尝试创建一个从列表中删除重复项的函数,并用一个元素替换它们。 继续收到错误消息“函数removeduplicate中的非穷举模式”。 我认为这意味着我的模式匹配缺少可能的情况? 我想我已经涵盖了所有的可能性。 我对Haskell很新,所以任何帮助都非常感谢。
removeduplicate :: (Eq a) => [a] -> [a]
removeduplicate [] = []
removeduplicate (x:[]) = [x]
removeduplicate (x:z:[]) = if z == x then [x] else (x:z:[])
removeduplicate (x:y:[xs])
| x == y = x:(removeduplicate [xs])
| otherwise = x:y:(removeduplicate [xs])
你的问题在你的最终模式。 我假设它是为了匹配所有列表,但是你拥有它的方式是匹配一个列表和一个元素xs
。
这意味着编译器看到一个3元素列表的匹配,但不是任意长度的列表,这就是它抱怨的原因。
要解决此问题,请移除xs
周围的框。
removeduplicate (x:y:xs)
| x == y = x:(removeduplicate xs)
| otherwise = x:y:(removeduplicate xs)
现在, xs
被视为一个列表,所以您至少有三个项目匹配列表,而不仅仅是三个项目。
正如Matt Bryant所说,特定的编译器错误源于使用[xs]
而不是xs
。
你实际上也有一个冗余模式,
removeduplicate (x:z:[]) if z == x then [x] else (x:z:[])
该行可以被删除,因为x:y:[]
类型的模式已经被处理
removeduplicate (x:y:xs)
| x == y = x:(removeduplicate xs)
| otherwise = x:y:(removeduplicate xs)
由于xs
可以是空列表, removeduplicate []
可以解析为[]
。
但请记住,您提供的代码只能删除最多2个连续的重复元素。 随着三个连续的重复,两个相同的元素将被插入到结果中,这可能不是你想要的。
更完整的功能可能如下所示:
removeduplicate [] = []
removeduplicate (x:xs) = x:(removeduplicate $ dropWhile (== x) xs)
链接地址: http://www.djcxy.com/p/43277.html
上一篇: exhaustive patterns in function
下一篇: exhaustive guards cause irrefutable pattern match to fail?