0

我正在尝试确定是否可以在 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 列表理解和模式匹配

我的问题是从更大的工作/功能中提取的一个抽象示例,但希望我在这里抓住了问题的本质。我愿意接受其他建议。

4

1 回答 1

7

如果要过滤与模式匹配的元素,可以在 的左侧使用模式<-,例如

... = [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
于 2014-04-07T12:30:49.940 回答