"(_:_:_)"在Haskell中的含义是什么(来自GHCI的非详尽模式匹配错误)?

Car*_*ine 5 haskell pattern-matching non-exhaustive-patterns

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

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

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

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

recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]
Run Code Online (Sandbox Code Playgroud)

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

Sil*_*olo 11

recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]
Run Code Online (Sandbox Code Playgroud)

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

recaList :: [Int] -> [Int]
recaList [] = []
recaList xs = map recaMan xs
Run Code Online (Sandbox Code Playgroud)

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

recaList :: [Int] -> [Int]
recaList xs = map recaMan xs
Run Code Online (Sandbox Code Playgroud)

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