【问题标题】:Deleting the second element in tuples删除元组中的第二个元素
【发布时间】:2011-09-28 07:44:47
【问题描述】:

我有一个看起来像这样的元组列表。

[ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ]

我的目标是让 [1,2,3,4,5] 摆脱困境。

我尝试使用map 和filter 删除所有Bools,但filter 也删除了元组中的第一个元素。如果我可以删除每个元组中的Bools,那么我可以使用循环将每个元组的fst 分配给一个新的空列表?

【问题讨论】:

  • 不太清楚你上次编辑的意思(我回滚了)?

标签: list haskell tuples


【解决方案1】:
f :: [[(a, b)]] -> [a]
f = concatMap (map fst)

那么f [ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ] 就是[1,2,3,4,5]。

【讨论】:

  • 哇,这是一个非常简单的解决方案。不知道您可以将 fst 应用于地图。谢谢!
  • 你可以给map任何函数,它会给你一个在适当类型列表上工作的函数。
【解决方案2】:

或者使用列表推导:

f xss = [fst x | xs <- xss, x <- xs]

【讨论】:

    【解决方案3】:

    试试这个(编辑,感谢 Michael Kohl 和 pat 的 cmets):

    fun :: [[(a,b)]] -> [a]
    fun = map fst . concat
    

    然后在 GHC 中:

    *Main> let l = [ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ]
    [[(1,True),(2,True)],[(3,False),(4,False),(5,False)]]
    *Main> fun l
    [1,2,3,4,5]
    

    【讨论】:

    • 您的匿名函数在Prelude 中作为fst: hackage.haskell.org/packages/archive/base/latest/doc/html/…
    • 哦,那么您可能还想查看concatMap 而不是map foo $ concat。
    • 第一,应该是fun = map fst . concat,第二,concatMap foo是concat . map foo而不是map foo . concat
    • 我的错,真的。我以为我在 GHC 中尝试过这个功能,但它确实似乎是错误的。谢谢。
    【解决方案4】:
    foldl1 (\acc x -> acc ++ x)  [a | b <- lst, let a =  map fst b]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多