我在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个元素。
答案 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]