Haskell рекурсивное добавление элементов данных в матрицу из строковой матрицы с указателями - PullRequest
0 голосов
/ 07 февраля 2020

Пожалуйста, перейдите к редактированию:

Мне нужно решить проблему с домашним заданием, возможно, я совершенно не прав в этом, но я новичок в функциональном программировании.

У меня есть Матрица 5x5 со строками, я хочу их прочитать, преобразовать в элемент данных и применить к новой матрице.

Я использую рекурсивный подход, потому что хочу добавить позицию Строка в элемент данных!

вот что я попробовал:

cycleMatrix :: Int -> Int -> [[String]] -> [[Data]]
cycleMatrix 0 0 matrix = (strToData 0 0 (matrix !! 0) !! 0))
cycleMatrix n 0 matrix = (cycleMatrix (n - 1) 0 matrix):(strToData n 5 ((matrix !! n) !! 5))
cycleMatrix n m matrix = (cycleMatrix n (m - 1) matrix):(strToData n n ((matrix !! n) !! m))

с strToData Я получаю строку из матрицы и передаю x и y, возвращая объект данных (это работает)

В данный момент я просто пытаюсь добавить каждый элемент в массив, но я действительно хочу начинать новый список каждый раз, когда достигаю нуля на m (после cycleMatrix n 0 matrix)

My вопросы: это путь к go и как мне правильно добавить этот элемент?

Редактировать: Хорошо, я наконец-то заставил его работать, разделив функции (спасибо Руди, что я не сказал сделать все сразу)

Но мои вопросы все еще стоят. Теперь у меня есть 8 списков, заполненных элементами данных. Я могу добавить их все в список с помощью [] ++ [], но есть ли способ создать матрицу из списков, например [] : [] (добавление списка в качестве элемента в список)?

1 Ответ

2 голосов
/ 07 февраля 2020

Я бы решил эту проблему путем перечисления внутренних списков в (x, data) кортежей¹, а затем перечислил бы это перечисление в (y, [x-lists]). Тогда это отправная точка для преобразования этого в желаемый формат.

Вы можете загрузить этот файл в ghci с помощью :load file.hs и поиграть с различными функциями там.

romиз вашего редактирования I угадай, что это то, что ты уже сделал

example :: [[String]]
example = [
        ["as", "df", "ghj"],
        ["xx", "yy"]
    ]

-- add a position number to each list element. Beware
-- that this starts with 1
enumerate :: [a] -> [(Int, a)]
enumerate = zip [1..]

-- does the enumeration, but does not transform the
-- data into the desired format. I put it here, so that
-- the functionality of the different functions is
-- better to understand.
kindofEnumarate2d :: [[a]] -> [(Int, [(Int, a)])]
kindofEnumarate2d = enumerate . map enumerate

-- convert a row of (y, [(x, value)]) tuples into a
-- [((x,y), value)] list
helper :: (Int, [(Int, a)]) -> [((Int, Int), a)]
helper (y, xs) = [((x, y), s) | (x, s) <- xs]

-- transform each row of the "kind-of" transformed
-- rows into the desired format.
enumerate2d :: [[a]] -> [[((Int, Int), a)]]
enumerate2d = map helper . kindofEnumarate2d
...