Haskell 中的“(_:_:_)”是什么意思(来自 GHCI 的非详尽模式匹配错误)?

What does "(_:_:_)" mean in Haskell (non-exhaustive pattern matching error from GHCI)?

当我 运行 我的 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]

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

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

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

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

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

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

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