过滤元组列表

时间:2009-10-24 16:33:58

标签: list haskell syntax

Haskell的新手,并有一个绊脚石。我正在尝试根据第一项过滤元组列表。

filter (==(x,_)) lis

我收到了非法的“_”错误,但我不确定如何绕过它?

2 个答案:

答案 0 :(得分:22)

在Haskell中,你不能像列表那样迭代一个元组。

如果元组只有两个项目,您可以使用fst来检索元组的第一项,并使用snd来检索第二项。

我认为你想做的事情的一种方法是这种方法:

Prelude> let lst = [(1,2), (3,4)]
Prelude> filter ((==1).fst) lst
[(1,2)]

仅返回列表中第一个元素等于1的项;当然,你可以用x替换我放置的地方。

为了更具体一点,(==1).fst首先将fst应用于lst中的元素,然后将(==1)应用于fst的结果 - 从技术上讲,点将两个函数组合在一起

答案 1 :(得分:5)

您不能在其中为_运算符(或任何其他函数)添加带有通配符==的参数。论证需要是一个真正的价值,而不是一个应该匹配的模式。

如果你想使用模式匹配,可以在filter条件下使用lambda函数:

filter (\(a,_) -> a == x) lis

此外,还有预定义函数fst来提取双元素元组的第一个元素。这可以与==结合使用来进行相同的测试:

filter ((== x) . fst)) lis