如何在每个列表中打印某个元素

时间:2016-11-09 04:53:29

标签: list haskell tuples

我在haskell中进行编码,想知道如何在多列表中找到某个元素。

这里举一个例子:

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

假设我想找到每个列表的第3个元素。

因此该程序将打印出4,6,1,6

我知道!!但是当我做x之类的事情时! 3,它打印出第三行(1,2,5,6,2)。

我想要它,所以打印出每个列表的第3个元素。

1 个答案:

答案 0 :(得分: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 - >第四个上面的值?):

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

现在我们有一个这样的元组列表,我们希望将它应用于每个元组。我们可以使用map执行此操作,它将函数应用于每个函数并返回每个元组中第三个值的列表:

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

或者,通过eta-reduction:

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]