Преобразовать список в матрицу (Haskell) - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь преобразовать список в массив (список списков) из функции, которая получает Int (i), который является счетчиком, который всегда начинается с 0, другой Int (n), который является длиной каждого строка и список, который я должен преобразовать в матрицу.

createMatrix :: (Int, Int, [Int]) -> [[Int]]
createMatrix (i, n, ([])) = []
createMatrix (i, n, (x:y)) = if (i < n) then [x] : createMatrix (i+1, n, (y))
                            else  [] ++ createMatrix (0, n, (x:y))

Это дает мне в качестве вывода:

[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18]]

когда должно быть что-то вроде:

[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]]

в случае, если n равно 6

У кого-нибудь есть идея, что я могу потерпеть неудачу? Я попробовал несколько вещей и не нашел решения.

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Альтернативное решение, которое обходится без counter и просто разбивает ваш список каждые данные n:

matrixEvery :: Int -> [a] -> [[a]]
matrixEvery _ [] = []
matrixEvery n xs = as : matrixEvery n bs
  where (as,bs) = matrixEvery n xs

Рекурсия используется вместо обхода счетчика. Единственный недостаток - вы, если вы хотите, чтобы ваши матрицы были одинакового размера, это не сработает, но приблизит вас:)

0 голосов
/ 31 октября 2018

Вы всегда добавляете новый список к своему выводу, когда пишете [x]:createMatrix (...). И когда вы делаете [] ++ createMatrix (...), вы ничего не делаете для своего результата; concat пустой список ничего не делает.

Вы хотите добавить x к первому списку в результате createMatrix (...) вместо добавления [x] ко всему результату.

В случае else вы хотите добавить новый пустой список вместо попытки использовать ++, который объединяет два списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...