如何解决这个问题?
问题是重新排序双打列表:
[ [a, b, c], [aa, bb, cc] ]
进入这个:
[ [a, aa], [b, bb], [c, cc] ]
在讨论之后我想出了以下内容(这个函数越来越深入地挖掘子列表,将head
加入并加入它们):
organize xs = organize' xs head
--recursive function (type stolen from ghci)
organize':: [[a]] -> ([a] -> b) -> [b]
organize' [] f = []
organize' xs f = (map f xs)++(organize' xs (f . tail)
这不太好(我认为它确实如此) - 在我成功的喜悦中,我完全错过了错误:
Exception: Prelude.head: empty list
答案 0 :(得分:2)
你提到“双打”意味着你想要一个2元组列表(即“双打”),而不是2元素列表的列表。 (或许这个措辞特别适合我的函数式编程101讲师!)
在这种情况下,zip
正是这样做的:
zip [1, 2, 3] [4, 5, 6] = [(1,4),(2,5),(3,6)]
如果你做需要一个2元素列表(而不是元组)的列表,你可以使用zipWith:
organize [xs,ys] = zipWith (\x y -> [x,y]) xs ys
或者您正在寻找适用于任意数量列表的内容吗?在那种情况下(正如其他人评论的那样)来自Data.List的transpose
就是你所追求的:
transpose [[1,2,3],[4,5,6]] = [[1,4],[2,5],[3,6]]