【问题标题】:How to print a certain element in each list如何打印每个列表中的某个元素
【发布时间】:2016-11-09 04:53:28
【问题描述】:

我正在使用 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)。

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

【问题讨论】:

  • 您确定您的意思不是要列出列表吗?现在,您有一个元组列表。除此之外,Haskell 中没有通用的方法从给定的元组和索引中提取元素。你能做的最好的就是map (\(_,_,_,e,_) -> e) x
  • 所以x !! 3会得到x的第三个索引,而不是x的每个元素的第三个索引?如何将函数应用于列表的每个元素?
  • @Alec 没有办法遍历每个列表并获得某个元素吗?
  • @ShawnSmith 有一种方法可以通过 lists 来获取某个元素(它是您已经找到的 (!!) 运算符),但是您有一个元组列表。注意(1,2,3,4,5)[1,2,3,4,5] 之间的区别(尝试在 GHCi 中查看它们的类型)。
  • @Alec 提供给我的数据基本上就像我在问题中的唯一数据。这是一个很大的列表,我只是缩短了它。也许没有办法得到那个特定的元素,但是我们可以检查一下 6 是否在元素 3 中?

标签: list haskell tuples


【解决方案1】:

您提供的实际上不是列表列表,而是元组列表。元组根据元素的数量和类型有一个特殊的类型,所以你上面的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]

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多