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
我认为这样做太简单了,但错误仍然存在 我很震惊
答案 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 ...
表达式)。
答案 3 :(得分:0)
你必须使用let吗?
如果没有,这是最简单的。
countList [] = 0
countList (x:xs) = 1 + countList xs
0的条件应该在通用条件之前。