Haskell,一个简单的模式匹配错误 let countList(x:xs)=1+countList xs 让countList[]=0 计数表[1,2,3] ***异常::35:5-20:函数countList中的非穷举模式

Haskell,一个简单的模式匹配错误 let countList(x:xs)=1+countList xs 让countList[]=0 计数表[1,2,3] ***异常::35:5-20:函数countList中的非穷举模式,haskell,pattern-matching,Haskell,Pattern Matching,我认为这太简单了,无法得到一个错误,但错误仍然存在 我很震惊我猜你在GHCi工作。代码的问题在于,您没有在单个函数上定义模式匹配的两种情况,而只是重新定义了函数本身。因此,将let countList(x:xs)=1+countList xs部分替换为let countList[]=0,这实际上是一个非穷举模式匹配。使用多个let语句意味着您实际上定义了两个函数,第二个定义隐藏第一个定义。因此,countList[1,2,3]抛出一个异常,因为范围中的定义仅为[]定义 您需要使用一个let同时定

我认为这太简单了,无法得到一个错误,但错误仍然存在
我很震惊

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

使用多个
let
语句意味着您实际上定义了两个函数,第二个定义隐藏第一个定义。因此,
countList[1,2,3]
抛出一个异常,因为范围中的定义仅为
[]
定义

您需要使用一个
let
同时定义两个方程。您可以在一行中键入它们,用分号分隔大小写

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
或者使用GHCi的多行语法
:{…:}
,确保第二个
countList
与第一个对齐

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

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


另请参见:您必须使用let吗
如果不是,这是最简单的

> :{
| let countList (x:xs) = 1 + countList xs
|     countList [] = 0
| :}

0的条件应在泛型条件之前

你震惊了?哦,当我使用的case来匹配它们时,这是正确的
countList [] = 0
countList (x:xs) = 1 + countList xs