2014-11-22 2 views
2

Первый список имеет длину 27, я хочу, чтобы превратить это в список длины 9 таким образом, что индексы список объединяются, как показано во втором списке ниже:Tricky преобразование списка в Haskell

[[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

Какова процедура получения второго списка с первого? – Aleksandar

+1

Мне совершенно непонятно, что эта функция должна делать с 1 вход-выход. Если у вас есть решение, но вы ищете более простой вариант, вы должны включить существующее решение. Если у вас нет решения, вы должны включить свои попытки. Вы также должны указать описание на английском языке того, что делает функция. – user2407038

+0

Посмотрите на ответ jamshidh, это именно то, что я хочу сделать, но искал более общее решение. – user3139545

ответ

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] дает вторую матрицу.

+0

То есть, очень приятно! благодаря – user3139545

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]] 
Смежные вопросы