Haskell 递归列表时出现非穷举模式错误

Haskell 递归列表时出现非穷举模式错误,haskell,recursion,Haskell,Recursion,我得到以下错误,如果我尝试执行x_length函数,它应该测量给定列表的长度: 例外:测试。hs:2:1-36:函数x_长度中的非穷举模式 我使用Prelude>:l test.hs将我的test.hs文件加载到ghci中 x_length函数的实现是(在test.hs文件中): 我已经弄明白了,它与加载test.hs文件有关,但我还没有弄明白如何解决这个问题 我使用x_length[1,2,3,4]执行的实际函数调用再次查看您的定义: x_length :: [Int] -> Int x

我得到以下错误,如果我尝试执行
x_length
函数,它应该测量给定列表的长度:

例外:测试。hs:2:1-36:函数x_长度中的非穷举模式

我使用
Prelude>:l test.hs
将我的
test.hs
文件加载到ghci中

x_length
函数的实现是(在
test.hs
文件中):

我已经弄明白了,它与加载
test.hs
文件有关,但我还没有弄明白如何解决这个问题


我使用
x_length[1,2,3,4]
执行的实际函数调用再次查看您的定义:

x_length :: [Int] -> Int
x_length (x:xs) = 1 + x_length xs
现在让我们评估一下
x_长度[1,2,3,4]

x_length [1,2,3,4]
x_length (1:2:3:4:[])
= 1 + x_length (2:3:4:[])
= 1 + 1 + x_length (3:4:[])
= 1 + 1 + 1 + x_length (4:[])
= 1 + 1 + 1 + 1 + x_length []
但是您的定义没有匹配
[]
的理由!它有一个大小写匹配的
(x:xs)
,但这至少需要列表中的一个元素。因此错误是:“非穷举模式”;也就是说,有一个案例与模式不匹配

要解决此问题,您需要一个额外的案例,用于
x\u length[]
。因此,您的定义如下所示:

x_length :: [Int] -> Int
x_length [] = _something
x_length (x:xs) = 1 + x_length xs
给你一个小练习:
\u某物应该是什么?(提示:空列表的长度是多少?);将鼠标悬停在上面以显示答案

x_长度[]=0


提示:哪些列表与
(x:xs)
匹配?如果仍有疑问,请尝试“手动”评估函数,以获得一个合理的短列表,并查看发生了什么情况代码的明显逻辑问题是
x_length
从不返回值。它总是调用自身(再次调用自身(再次调用自身(which…))。如果您到达列表的末尾,那么它是
[]
,而不是
(x:xs)
?@RobinZigmond对我来说一切都是|)。启用警告会使GHC报告丢失的
[]
案例。我建议始终启用警告。感谢您的详细回答。通过我发现的注释部分,我必须检查空列表案例。但是我不知道,我可以在函数的实际实现之上声明第二个case
x_length[]=0
。该方法是作为一个函数处理,还是这两个函数不同?对不起,我是哈斯克尔的新手。非常感谢。@TabmanRekoj这是一个函数,根据与输入匹配的模式,“分支”到多个定义中的一个:将使用匹配的最顶层模式。这可以被认为是类似于数学中的分段函数。实际上,这相当于在函数定义中直接使用
case
语句。@TabmanRekoj详细阐述了DarthFennec的评论:在Haskell编译器中,
f case1=\u something;f case2=_somethingelse
与{case1->_somethingelse;case2->{u somethingelse}
fx=案例x相同。
x_length :: [Int] -> Int
x_length [] = _something
x_length (x:xs) = 1 + x_length xs