Haskell,简单的模式匹配会产生错误

时间:2013-06-04 08:55:29

标签: haskell pattern-matching

let countList (x:xs) = 1+countList xs
let countList [] = 0
countList [1,2,3]
*** Exception: <interactive>:35:5-20: Non-exhaustive patterns in function countList

我认为这样做太简单了,但错误仍然存​​在 我很震惊

4 个答案:

答案 0 :(得分:12)

使用多个let语句意味着您真正定义了两个函数,第二个定义遮蔽了第一个函数。因此,countList [1, 2, 3]会抛出异常,因为范围内的定义仅为[]定义。

您需要使用单个let同时定义两个方程式。您可以在一行上键入它们,用分号分隔案例

> let countList (x:xs) = 1 + countList xs; countList [] = 0

或使用GHCi的多行语法:{ ... :},确保将第二个countList与第一个> :{ | let countList (x:xs) = 1 + countList xs | countList [] = 0 | :} 对齐。

{{1}}

答案 1 :(得分:2)

我猜你在GHCi工作。您的代码的问题在于您没有在单个函数上定义两种模式匹配的情况,而是您只是重新定义函数本身。因此,您将let countList (x:xs) = 1+countList xs部分替换为let countList [] = 0,这实际上是非详尽的模式匹配。

答案 2 :(得分:1)

您正在重新定义countList功能,而不是使用更多模式保护来扩展现有定义。我不确定在GHCi中是否有办法做你想做的事情(除了使用case ... of ...表达式)。

另见:GHCi "let" -- what does it do?

答案 3 :(得分:0)

你必须使用let吗?
如果没有,这是最简单的。

countList [] = 0
countList (x:xs) = 1 + countList xs

0的条件应该在通用条件之前。