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

Haskell中的Set Comprehensions中的模式匹配是可能的,还是什么是替代方案?

如何解决《Haskell中的SetComprehensions中的模式匹配是可能的,还是什么是替代方案?》经验,为你挑选了1个好方法。

我试图找出是否有可能在Haskell集合理解中模式匹配.我有一个包含元组或嵌套列表和元组的列表列表;

例如

[[(1,("A",1)), (2,("B",1))], [(0,("A",1)), (3,("B",2)),  (2,("C",1))]]

我想丢弃包含"A"的元组,并在其他元素上执行任意计算.

我在思考:

pack(xs:xss) = [package x | x <- xs, x /= (1,("A", 1))] : (pack xss)
pack(_) = []

package x = case x of
    (i, ("B", j)) -> (i + j, ("B", j * i)) 
    (i, ("C", j)) -> (i * j, ("C", j + i))
    (otherwise) -> x

以下可能允许使用通配符:

x /= (1,("A", 1))

如:

x /= (_,("A", _))

值得注意的是,嵌套元组中的数字将始终为int类型,不确定是否有帮助......

我环顾四周但看不出这是否可能,似乎过滤是一个更好的选择,如下所述; 但是我们正在过滤未知数.

Haskell列表理解和模式匹配

我的问题是来自更大的工作/功能的抽象示例,但希望我已经在这里捕获了问题的本质.我愿意接受其他建议.



1> hammar..:

如果您想过滤图案匹配的元素,可以使用左侧的图案<-,例如

... = [package x | x@(_, ("A", _)) <- xs] : ...

这会抛弃任何与模式不匹配的东西.

过滤模式不匹配的元素并不是很好.你可以使用case表达式作为后卫,但它有点难看.

... = [package x | x <- xs, case x of (_,("A", _)) -> False; _ -> True] : ...

更漂亮的替代方案是将模式匹配移动到函数中.

... = [package x | x <- xs, want x] : ...
   where want (_,("A", _)) = False
         want _ = True

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