Sha*_*ith 0 haskell tuples list
我在haskell编码,想知道如何在多列表中找到某个元素.
这里举个例子说:
x = [(1,2,3,4,5),
(3,4,5,6,6),
(5,6,2,1,1),
(1,2,5,6,2)];
Run Code Online (Sandbox Code Playgroud)
假设我想找到每个列表的第3个元素.
所以该程序将打印出4,6,1,6
我知道!! 但是当我做x之类的事情时!3,它打印出第三行(1,2,5,6,2).
我想要它所以它打印出每个列表的第3个元素.
你提供的实际上不是列表列表,而是一个元组列表.元组具有基于元素的数量和类型的特殊类型,因此x上面的类型是[(Int,Int,Int,Int,Int)].
与允许我们使用!!运算符(例如[1,2,3] !! 1 = 2)通过索引提取值的列表不同,为了从元组中提取特定值,我们必须模式匹配整个元组,为我们希望提取的值提供一些名称并在其中使用它我们的回报价值.要从保存5个值的元组中提取第四个值,我们可以编写如下函数:
f (a,b,c,d,e) = d
Run Code Online (Sandbox Code Playgroud)
或者,作为一个匿名函数(因为,如果我们只是在列表上映射时使用它,那么不要为它指定名称而感到高兴):
(\(a,b,c,d,e) -> d)
Run Code Online (Sandbox Code Playgroud)
既然我们只关心第四个值,我们可以选择丢弃所有其他值(你说第三个但是指的是索引3 - >第四个上面的值?):
(\(_,_,_,x,_) -> x)
Run Code Online (Sandbox Code Playgroud)
现在我们有一个这样的元组列表,我们希望将它应用于每个元组.我们可以这样做map,它将函数应用于每个并返回每个元组的第三个值的列表:
f xs = map (\(_,_,_,x,_) -> x) xs
Run Code Online (Sandbox Code Playgroud)
或者,通过eta减少:
f = map (\(_,_,_,x,_) -> x)
Run Code Online (Sandbox Code Playgroud)
用法示例:
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]
Run Code Online (Sandbox Code Playgroud)