【问题标题】:Haskell map list of tuples to list of tuplesHaskell 将元组列表映射到元组列表
【发布时间】:2016-07-31 14:44:27
【问题描述】:

我正在尝试将一个元组列表映射到另一个元组列表,但没有成功。

示例输入:

a = [("eo","th"),("or","he")]

示例输出:

[('e','t'),('o','h'),('o','h'),('r','e')]

我试过了:

map (\(a,b) -> (a!!0,b!!0):(a!!1,b!!1):[]) a

但它会产生:

[[('e','t'),('o','h')],[('o','h'),('r','e')]]

【问题讨论】:

    标签: list haskell dictionary tuples


    【解决方案1】:

    您必须在结果中使用concat 或使用concatMap 而不是map。毕竟,您在地图中返回列表并因此获得列表列表。


    让我们给你的函数一个名字和一个类型:

    magic :: [([Char], [Char])] -> [(Char, Char)]
    

    现在,我们可以将其视为一个两步过程:从原始列表中的每一对中,我们将获得一个列表:

    magicPair :: ([Char], [Char]) -> [(Char, Char)]
    magicPair (a,b) = zip a b
    

    现在我们需要将magicPair 映射到原始列表中的所有元素并连接结果:

    magic xs = concat (map magicPair xs)
    

    concat . map f 的组合非常常见,因此有一个名为 concatMap 的函数:

    magic xs = concatMap magicPair xs
    

    并且在一对而不是两个参数上使用函数f也很常见,所以magicPair = uncurry zip

    magic xs = concatMap (uncurry zip) xs
    

    我们现在可以删除两边的xs,最终得到magic的最终变体:

    magic = concatMap (uncurry zip)
    

    【讨论】:

      【解决方案2】:

      这里有一个快速的方法来给你输出

      simplify = (>>= uncurry zip)
      

      【讨论】:

      • 对于任何语言初学者来说都是完全混淆的。
      • @Zeta - .... 这会诱使他们想了解更多有关 Haskell 有多酷的信息。
      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2018-04-24
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多