3
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

4 回答 4

13

使用多个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
| :}
于 2013-06-04T09:02:48.167 回答
2

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

于 2013-06-04T09:02:43.990 回答
1

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

另见:GHCi“让”——它有什么作用?

于 2013-06-04T09:03:25.253 回答
0

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

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

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

于 2013-06-04T10:02:36.500 回答