我正在尝试确定是否可以在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类型,不确定是否有帮助...
我环顾四周,但看不到是否可行,如下所示,似乎过滤是一个更好的选择。但是我们正在过滤未知数。
我的问题是从较大的工作/功能中提取的一个抽象示例,但希望我已经在这里抓住了问题的实质。我愿意接受其他建议。
如果您想过滤与某个模式匹配的元素,则可以在的左侧使用一个模式<-
,例如
... = [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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句