重新组织列表列表

时间:2012-02-22 01:19:33

标签: haskell

如何解决这个问题?

问题是重新排序双打列表:

[ [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

1 个答案:

答案 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]]