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
。下划线仅表示被忽略的值,因此 (_:_:_)
匹配任何至少包含两个元素的列表。编译器告诉您您未能匹配这种情况。
当我 运行 我的 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
。下划线仅表示被忽略的值,因此 (_:_:_)
匹配任何至少包含两个元素的列表。编译器告诉您您未能匹配这种情况。