Haskell - 模式匹配在列表理解中如何失败?

标签 haskell functional-programming pattern-matching list-comprehension

我正在通过 Miran Lipovaca 的“Learn You a Haskell for Great Good!”学习 Haskell。第 82 页上写着

If a pattern match fails, the list comprehension will just move on to the next element, and the element that failed won’t be included in the resulting list.

示例:

ghci> let xs = [(1,3),(4,3),(2,4),(5,3),(5,6),(3,1)]
ghci> [a+b | (a, b) <- xs]
[4,7,6,8,11,4]

我的问题是模式匹配如何失败? 他这话是什么意思?我真的不明白。这可能是因为我的英语很弱。我请您举个例子,因为我认为这本书没有给出任何模式匹配失败的例子。

我考虑过,如果列表包含列表理解无法处理的类型,那么它会移动到下一个元素,但如果我以这种方式更改列表:

let xs = [(1,3),(4,3),(2,4),(5,3),True,(5,6)]

然后它甚至无法编译,因为它“无法匹配预期类型”...

最佳答案

以下是列表推导式中模式匹配失败的一些案例,在 GHCi 中进行了演示:

Prelude> [ () | True <- [True, False,True] ]
[(),()]
Prelude> [ x | (x, True) <- [(1,True), (2,False), (3,True)] ]
[1,3]
Prelude> [ x+1 | Left x <- [Left 1, Right "Hello", Right "world", Left 2] ]
[2,3]

请注意,某些模式永远不会失败,例如x , (x,y) ,或(x,(a,b),z) 。这是因为它们匹配仅具有构造函数的类型,而构造函数必须匹配为唯一的构造函数。

一般来说,模式匹配涉及多个分支,例如

case someValue of
   Left x  -> ...
   Right y -> ...

foo Nothing = ...
foo (Just x) = ...

在这些情况下,如果我们忘记处理构造函数,那么在发生这种情况时我们会收到运行时错误。 (打开警告有助于避免这种情况!)。

在列表推导式生成器中 p <- ... ,相反,我们只能指定一种模式。但是,适用一个特殊规则:模式匹配失败不是错误,而是被忽略。

关于Haskell - 模式匹配在列表理解中如何失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225819/

相关文章:

regex - 模式匹配 Scala 正则表达式评估

list - Ocaml 将 bool 列表评估为单个 bool 值

haskell - 线程范围功能

haskell - 与 TypeApplications 一起使用时,AllowAmbigouslyTypes 有多危险?

string - 字符 ' ' 处的字符串/字 rune 字中的词法错误?

scala - 为什么 `scala.util.Try(date)` 未定义时 `Failure` 不返回 `date`?

javascript - Javascript 行为委托(delegate)模式中的变量隐私

java - 如何使用正则表达式将字符串中的连续重复字符替换为 '0'?

haskell 带 2 个参数的函数返回带 1 个参数的函数?

javascript - 以函数式编程风格存储值