List 每三个列表连接一次

List 每三个列表连接一次,list,haskell,List,Haskell,我有一大堆清单。我想把每三个列表合并到一起。像这样 let xss = [[1,2,3],[1,2,3],[1,2,3], [4,5,6],[4,5,6],[4,5,6], [7,8,9],[7,8,9],[7,8,9]] someFunk xss = [[1,2,3,1,2,3,1,2,3], [4,5,6,4,5,6,4,5,6], [7,8,9,7,8,9,7,8,9]] 有什么

我有一大堆清单。我想把每三个列表合并到一起。像这样

let xss = [[1,2,3],[1,2,3],[1,2,3],
           [4,5,6],[4,5,6],[4,5,6],
           [7,8,9],[7,8,9],[7,8,9]]

someFunk xss = [[1,2,3,1,2,3,1,2,3],
                [4,5,6,4,5,6,4,5,6],
                [7,8,9,7,8,9,7,8,9]]

有什么方法可以做到这一点吗?

您可以尝试以下方法:

someFunk :: [[a]] -> [[a]]
someFunk (x:y:z:zs) = (x ++ y ++ z) : someFunk zs
someFunk (x:y:ys) = (x ++ y) : someFunk ys
someFunk (x:xs) = x : someFunk xs
someFunk _ = []
import Data.List.Split
someFunk = map concat . chunksOf 3
使用模式匹配,您可以检查至少有三个列表的列表,将它们连接起来,然后在列表的其余部分递归调用它。如果列表计数不是3的精确倍数,则后续模式仍然允许您在可用时连接下一个3


就为了骑自行车,我想我会这样写:

someFunk :: [[a]] -> [[a]]
someFunk (x:y:z:zs) = (x ++ y ++ z) : someFunk zs
someFunk (x:y:ys) = (x ++ y) : someFunk ys
someFunk (x:xs) = x : someFunk xs
someFunk _ = []
import Data.List.Split
someFunk = map concat . chunksOf 3

它很简洁,我想它读起来也很像你的英文描述。它使用软件包。

当然有。你试过什么吗?@shree.pat18是的
catThird(xs:xss)=xs++take 9(catThird-xss)
但它只在前3个列表中起作用。我不知道你可以像这样进行模式匹配
(x:y:z:zs)
,但现在当我看到它时,它是有意义的!