2016-11-09 71 views
0

我在haskell中编码,并且想知道如何在多个列表中找到某个元素。如何打印每个列表中的某个元素

下面的例子让说:

x = [(1,2,3,4,5), 
     (3,4,5,6,6), 
     (5,6,2,1,1), 
     (1,2,5,6,2)]; 

让我们说,我想找到每个列表的第三个元素。

所以程序会打印出来4,6,1,6

我知道!!但是当我做一些像x一样的东西! 3,它打印出第三行(1,2,5,6,2)。

我希望它打印出每个列表的第三个元素。

+1

您确定不打算列出清单吗?现在,你有一个元组列表。除此之外,Haskell没有通用的方式来从给定的元组和索引中提取元素。你可以做的最好的是map(\(_,_,_,e,_) - > e)x'。 – Alec

+0

so'x !! 3'会得到'x'的第三个索引,而不是'x'的每个元素的第三个索引?你如何将一个函数应用于列表的每个元素? – bheklilr

+0

@Alec theres没有办法像通过每个列表去获得某个元素? –

回答

7

你提供的实际上并不是列表的列表,而是元组列表。元组根据元素的数量和类型有特殊的类型,所以上面的x的类型是[(Int,Int,Int,Int,Int)]

不像名单,这让我们通过与!!运营商索引中提取值(例如:[1,2,3] !! 1 = 2),以便从一个元组,我们必须格局,整个元组匹配提取特定的值,给一些名字,我们希望值在我们的返回值中提取和使用它。为了从持有5个值的元组的第四值,我们可以写这样的功能:

f (a,b,c,d,e) = d 

或者,作为一个匿名函数(因为,如果我们只打算使用它时,映射在列表,这是很好的懒得给它分配一个名称):

(\(a,b,c,d,e) -> d) 

由于我们只关心第四值,我们可以选择放弃所有其他人(你说的第三,但意味着指数3 - 上面>第4期) :

(\(_,_,_,x,_) -> x) 

现在我们有一个这样的元组列表,我们希望将它应用于每个元组。我们可以map做到这一点,这将适用于功能到每个并从每个元组返回第三值的列表:

f xs = map (\(_,_,_,x,_) -> x) xs 

或者,用ETA还原:

f = map (\(_,_,_,x,_) -> x) 

用法示例:

gchi>> f [(1,2,3,4,5),(3,4,5,6,6),(5,6,2,1,1),(1,2,5,6,2)] 
[4,6,1,6] 
相关问题