第一个列表的长度为27,我想将其转换为长度为9的列表,以便组合列表索引,如下面的第二个列表所示:
[[Just 3,Just 6,Nothing],[Nothing,Just 7,Just 1],[Just 2,Nothing,Nothing]
,[Nothing,Just 5,Nothing],[Nothing,Nothing,Nothing],[Just 1,Just 8,Nothing]
,[Nothing,Nothing,Just 9],[Just 2,Nothing,Just 4],[Just 7,Nothing,Nothing]
,[Nothing,Nothing,Nothing],[Nothing,Just 1,Just 3],[Nothing,Just 2,Just 8]
,[Just 4,Nothing,Nothing],[Just 5,Nothing,Just 2],[Nothing,Nothing,Just 9]
,[Just 2,Just 7,Nothing],[Just 4,Just 6,Nothing],[Nothing,Nothing,Nothing]
,[Nothing,Nothing,Just 5],[Just 3,Nothing,Just 8],[Just 9,Nothing,Nothing]
,[Nothing,Just 8,Just 3],[Nothing,Nothing,Nothing],[Nothing,Just 6,Nothing]
,[Nothing,Nothing,Just 7],[Just 6,Just 9,Nothing],[Nothing,Just 4,Just 3]]
[[1,4,7],[2,5,8],[3,6,9]
,[10,13,16],[11,14,17],[12,16,18]
,[19,22,25],[20,23,26],[21,24,27]
这个问题最简单的方法是什么?
我一直在尝试使用foldr
,但我可以弄清楚如何根据索引将每个元素放在不同的列表中,数据如何组合有一个明确的模式,所以必须有一些利用这种模式的简单解决方案......
答案 0 :(得分:2)
这是你想要的吗?
import Data.List
chunksOf :: Int -> [a] -> [[a]]
chunksOf n [] = []
chunksOf n xs =
let (ys,zs) = splitAt n xs in ys : chunksOf n zs
regroup: [a] -> [[[a]]]
regroup = transpose $ map (chunksOf 3) $ transpose $ chunksOf 3 xs
例如,concat $ regroup [1..27]
为您提供第二个矩阵。
答案 1 :(得分:0)
如果你想要超级简单,如果这不是更大模式的一部分(即 - 你需要这个用于NxN矩阵),那就这样做。
f [x1,x2,x3,x3,x4,x5,x6,x7,x8,x9,x10,
x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,
x21,x22,x23,x24,x25,x26,x27] =
[[x1,x4,x7],[x2,x5,x8],[x3,x6,x9]
,[x10,x13,x16],[x11,x14,x17],[x12,x16,x18]
,[x19,x22,x25],[x20,x23,x26],[x21,x24,x27]]