Haskell中的棘手列表转换

时间:2014-11-22 22:15:12

标签: haskell

第一个列表的长度为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,但我可以弄清楚如何根据索引将每个元素放在不同的列表中,数据如何组合有一个明确的模式,所以必须有一些利用这种模式的简单解决方案......

2 个答案:

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