我正在通过 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/