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
我认为这太简单了,不会出错,但错误仍然存在我很震惊
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
我认为这太简单了,不会出错,但错误仍然存在我很震惊
使用多个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
| :}
我猜你在 GHCi 工作。您的代码的问题在于您没有在单个函数上定义模式匹配的两种情况,而只是重新定义了函数本身。因此,您将let countList (x:xs) = 1+countList xs
部分替换为let countList [] = 0
,这实际上是一个非详尽的模式匹配。
您正在重新定义countList
功能,而不是使用更多模式保护来扩展现有定义。我不确定是否有办法在 GHCi 中做你想做的事情(除了使用case ... of ...
表达式)。
你必须使用让吗?
如果没有,这是最简单的。
countList [] = 0
countList (x:xs) = 1 + countList xs
0 的条件应该在通用条件之前。