当我运行我的Haskell程序时,我从GHCI收到以下错误:
"Pattern match(es) are non-exhaustive
In an equation for `recaList': Patterns not matched: (_:_:_)"
我一直在搜索网络/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
将返回空列表,因此您的第一种情况也是不必要的。尽管上面的代码片段会起作用,但这将更惯用。
recaList :: [Int] -> [Int]
recaList xs = map recaMan xs
至于你关于错误语法是什么意思的问题,:
是列表构造运算符,所以(x:xs)
匹配任何非空列表,将第一个元素绑定到x
,其余元素绑定到xs
。 (x:y:ys)
执行相同的操作,但它将第一个绑定到x
,第二个绑定到y
,其余绑定到ys
。下划线仅指示忽略的值,因此(_:_:_)
匹配至少包含两个元素的任何列表。编译器告诉您,您未能匹配这种情况。