Haskell的新手,并有一个绊脚石。我正在尝试根据第一项过滤元组列表。
filter (==(x,_)) lis
我收到了非法的“_”错误,但我不确定如何绕过它?
答案 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