[英]Haskell map list of tuples to list of tuples
我试图将一个元组列表映射到另一个没有运气的元组列表中。
输入示例:
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')]]
您必须在结果上使用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
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)
这是给您输出的快速方法
simplify = (>>= uncurry zip)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.