4

运行 Haskell 程序时,我从 GHCI 收到以下错误:

"Pattern match(es) are non-exhaustive
 In an equation for `recaList': Patterns not matched: (_:_:_)"

我一直在搜索 web/SO,但似乎无法找到解释(_:_:_)。我的猜测只是一个空列表,但我已经在我的函数中考虑了这一点。

不确定它是否相关,但这是我的程序:

recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]

我认为问题只是我不知道是什么(_:_:_)

4

1 回答 1

11
recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]

这是匹配空列表和包含一个元素的列表。您未能匹配任何包含两个或更多元素的列表。我相信你的意思是

recaList :: [Int] -> [Int]
recaList [] = []
recaList xs = map recaMan xs

不需要括号。但是,map如果将其作为输入,将返回空列表,因此您的第一种情况也是不必要的。虽然上面的代码片段可以工作,但这会更惯用。

recaList :: [Int] -> [Int]
recaList xs = map recaMan xs

至于您关于错误语法意味着什么的问题,:是列表构造运算符,因此(x:xs)匹配任何非空列表,将第一个元素绑定xxs. (x:y:ys)做同样的事情,但它将第一个绑定到x,第二个绑定到y,其余的绑定到ys。下划线仅表示忽略的值,因此(_:_:_)匹配至少两个元素的任何列表。编译器告诉您您未能匹配这种情况。

于 2019-02-06T04:03:00.403 回答