【问题标题】:Filter through a list of 3(or greater)-tuples based on an element根据元素过滤 3 个(或更多)元组的列表
【发布时间】:2018-07-08 18:51:22
【问题描述】:

假设我有一个三元组列表,例如:

[(1,2,3),(4,5,6),(7,8,9)]

如果我想找到第一个元素为1 的每个项目,那么通过这些filter 的方法是什么。 filter ((==1).fst) 不能用作元组的长度不等于 2。我有一些想法,但我似乎无法将它们发展为可行的代码,所以我想看看是否有人有更好的解决方案可以建议更了解这种语言。

【问题讨论】:

  • 能不能把你需要的输出放出来
  • 如果您的元组代表某种非抽象数据,那么定义您自己的数据类型可能是值得的:data MyType = MyType {foo :: Int, bar :: Int, baz :: Int},因此您可以使用(==1) . foo,而不是使用(==1) . fst .这也使您的类型注释更容易理解。
  • @NigHamza 好吧,输出只是[(1,2,3)],但这并不代表我的具体问题,我只是让问题更笼统,因此人们将其用作资源会发现它更容易读书。还要感谢@AJFarmar 的帮助!在我自己的代码中,我这样做了,但我不想把这个问题弄得太多。

标签: haskell


【解决方案1】:

使用静态类型,最简单的方法可能是手动键入所有逗号:

filter (\(x,_,_) -> x == 1) [(1,2,3),(4,5,6),(7,8,9)]

(您可以尝试自动执行此操作,例如将fst 的通用版本编写为类方法,但随后您需要手动声明每个元组大小都是此类的一个实例。)

【讨论】:

    【解决方案2】:

    您可以使用镜头库,它提供了一个镜头来对元组进行操作。

    import Control.Lens
    
    filter ((== 1) . (^. _1)) [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
    

    Lens 使用 Field1 Field2 ... 之类的类型类来使上述代码成为可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 2014-04-22
      • 1970-01-01
      • 2019-08-03
      • 2021-01-12
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多