当前位置:  开发笔记 > 小程序 > 正文

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

如何解决《Haskell-模式匹配如何在列表理解中失败?》经验,为你挑选了2个好方法。

我正在和Miran Lipovaca一起学习Haskell的"为了好大学而学习哈斯克尔!".在第82页,它说

如果模式匹配失败,列表推导将只移动到下一个元素,失败的元素将不会包含在结果列表中.

例:

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)]

然后它甚至没有编译,因为它"无法匹配预期的类型"......



1> chi..:

以下是在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 <- ...相反,在列表推导生成器中,我们只能指定一个模式.但是,应用特殊规则:模式匹配失败不是错误,而是简单地忽略.



2> leftaroundab..:

不是模式匹配失败的例子(元组模式总是匹配).这将是一个例子:

Prelude> xs = [Just (1,3), Just (4,3), Nothing, Just (5,3), Nothing]
Prelude> [a+b | Just (a, b) <- xs]
[4,7,8]

这里,模式Just (a, b)只匹配的元素Just (1,3),Just (4,3)并且Just (5,3),而不是NothingS,所以这些职位只是不会在最终名单露面.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有