我有一个列表的大名单。我想每列表彼此。像这样的连接每三个列表
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 _ = []
使用模式匹配,你检查的列表,包括至少三个列表,加入他们的行列,并递归调用它的列表的其余部分。如果列表数不是3的精确倍数,则后续模式仍允许您在可用时连接下一个3。
不错。不知道你可以像这样'(x:y:z:zs)'来匹配匹配模式,但是现在当我看到它时,这是有道理的! –
只是为了bikeshedding的目的,我想我会写这样的事:
import Data.List.Split
someFunk = map concat . chunksOf 3
它的简洁,而且我认为它读起来很像你的英语描述。它使用split包。
当然有。你有尝试过什么吗? –
@ shree.pat18是的。 'catThird(xs:xss)= xs ++取9(catThird xss)'但它只适用于前3列表 –