2016-04-10 99 views
2

我试图将元组列表映射到元组的不同列表中,但没有运气。Haskell将元组列表映射到元组列表

示例输入:

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')]] 

回答

3

您必须对您的结果使用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) 
1

这里是一个快速的方式,让你的输出

simplify = (>>= uncurry zip) 
+2

这是完全针对任何语言初学者混淆。 – Zeta

+1

@Zeta - ....这会诱使他们想要更多地了解Haskell是多么的酷。 – jamshidh