我有一個列表的大名單。我想每列表彼此。像這樣的連接每三個列表
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列表 –