我试图找出是否有可能在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列表理解和模式匹配
我的问题是来自更大的工作/功能的抽象示例,但希望我已经在这里捕获了问题的本质.我愿意接受其他建议.
如果您想过滤与图案匹配的元素,可以使用左侧的图案<-
,例如
... = [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