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

Tab*_*koj 2 recursion haskell

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

异常:test.hs:2:1-36:函数x_length中的非穷举模式

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

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

x_length :: [Int] -> Int
x_length (x:xs) = 1 + x_length xs
Run Code Online (Sandbox Code Playgroud)

我已经知道,它必须与加载test.hs文件有关,但是我还没有弄清楚如何解决此问题。

我使用进行的实际函数调用x_length [1,2,3,4]

bra*_*drn 10

再次查看您的定义:

x_length :: [Int] -> Int
x_length (x:xs) = 1 + x_length xs
Run Code Online (Sandbox Code Playgroud)

现在,我们来评估一下x_length [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 []
Run Code Online (Sandbox Code Playgroud)

但是您的定义没有匹配的理由[]!它具有大小写匹配(x:xs),但这需要列表中至少有一个元素。因此出现错误:“非穷举模式”;也就是说,有一种情况没有通过模式匹配。

要解决此问题,您需要为添加一个额外的大小写x_length []。因此,您的定义将如下所示:

x_length :: [Int] -> Int
x_length [] = _something
x_length (x:xs) = 1 + x_length xs
Run Code Online (Sandbox Code Playgroud)

一个适合您的小练习:应该_something是什么?(提示:一个空列表的长度是多少?)如果需要的话,我会在答案中加扰号。将鼠标悬停在其上即可显示答案。

x_length [] = 0