2009-10-24 73 views
7

Haskell的新手和有一个绊脚石。我试图根据第一项筛选元组列表。过滤元组列表

filter (==(x,_)) lis 

我得到一个非法'_'错误,但我不知道我怎么能解决它?

回答

19

在Haskell中,不能像遍历列表一样遍历一个元组。

如果该元组只有两个项目,则可以使用fst检索元组的第一个项目并使用snd检索第二个项目。做什么,我觉得你想要做

一种方法是这样的方法:

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

其中仅将列表中的第一个元素等于1项;当然,您也可以替换x这里我把1

要成为一个更具体一点,(==1).fst首先应用fst在善堂的元素,然后应用到(==1)fst结果 - 技术上,点组成这两个功能在一起。

+0

这很好,谢谢。想知道那些。在所有示例代码中做了些什么! – Zippy 2009-10-24 16:59:12

+0

我认为'''和'$'之间的用法(和区别)是开始Haskell最常见的障碍之一 - 所以不用担心,你不是唯一遇到麻烦的人! – 2009-10-24 17:05:15

5

您不能在其中通配符_==运算符(或任何其他函数)发生争执。争论必须是一种真正的价值,而不是一种应该与之相匹配的模式。

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

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

此外,还有预定义功能fst提取两个元素的元组的第一个元素。这可以结合==做相同的测试:

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