【问题标题】:Filter list of tuples in haskell过滤haskell中的元组列表
【发布时间】:2014-05-11 22:59:20
【问题描述】:

我正在尝试过滤 haskell 中的元组列表。 我想返回第一个和第二个元素相同的元组。

我正在尝试这个

 filter ((==fst).snd) [(1,2), (2,2), (3,3)] 

但它不起作用。对此有什么想法吗?谢谢!

【问题讨论】:

    标签: haskell


    【解决方案1】:

    你可以使用uncurry:

    filter (uncurry (==)) [(1,2), (2,2), (3,3)]
    

    或者你可以匹配每个元组:

    filter (\(x,y) -> x == y) [(1,2), (2,2), (3,3)]
    

    【讨论】:

    • 如果我用 do 来获取一个 Char,我可以像这样使用上面的来获取 y 吗? filter ((x,y) -> x == 'a') [('a',"is for apple"),('b',"is for boy")] –– 返回 "is for apple"
    • @bentaisan - 是的,它适用于第一个元素具有 Eq 实例的任何元组。在元组之前你需要一个\filter (\(x, y) -> x == 'a'))
    • 知道了。谢谢。
    • 我知道了...我不想返回元组,我只想要 [Char] 字符串:filter (\(x, y) -> x == 'a') dictionary -- dictionary = [('a',"apple"),('b',"boy")] ,所以我想返回“apple”,而不是元组. p.s.
    【解决方案2】:

    试试这个:

    filter (\p -> fst p == snd p) [(1,2), (2,2), (3,3)]
    

    (==fst).snd 表示\p -> snd p == fst,显然这是行不通的。如果你真的不想使用 lambda 抽象,并且想要一个毫无意义的版本,这里有一种方法可以实现(你需要先导入 Control.Applicative):

    filter ((==) <$> fst <*> snd) [(1,2), (2,2), (3,3)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多