【问题标题】:What does "(_:_:_)" mean in Haskell (non-exhaustive pattern matching error from GHCI)?Haskell中的“(_:_:_)”是什么意思(来自GHCI的非详尽模式匹配错误)?
【发布时间】:2019-02-06 03:54:49
【问题描述】:

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

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

【问题讨论】:

  • 您可以在 Google 上搜索“模式匹配并非详尽无遗”。给出了许多相关的结果。 :) 关于“_”:在纯文本中使用,它被解释为 SO 上的 斜体 标记(* 也是如此)。要编写 code,我们通过将其括在反引号 ` 中来对其进行转义,如下所示:_italics_ marker(我输入了 "`_italics_ marker`"。为了显示包含反引号的代码,我们将其括在双反引号中。

标签: haskell pattern-matching non-exhaustive-patterns


【解决方案1】:
recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多