Как бороться с рекурсией в списке в Haskell (операция транспонирования) - PullRequest
0 голосов
/ 04 января 2019

Хотя я понимаю, что в Haskell могут быть функции транспонирования или ZipList, я пытаюсь создать свою собственную функцию транспонирования, которая будет принимать n списков равной длины m и транспонировать ихв m списки длины n .

Пока у меня есть функция, почти работающая со следующим кодом:

list = [[1,2,3],[4,5,6],[7,8,9]]

head' (x:xs) = x

head'' [] = []
head'' (xs:lxs) = head' xs:head'' lxs

tail' [] = []
tail' (x:xs) = xs

tail'' [] = []
tail'' (xs:lxs) = tail' xs:tail'' lxs

merge (xs:lxs) = (head' xs:head'' lxs):(merge (tail' xs:tail'' lxs))

, и я получаюследующий вывод, когда я запускаю> merge list в ghci, я получаю:

[[1,4,7],[2,5,8],[3,6,9],[*** Exception: list2.hs:16:1-16: Non-exhaustive patterns in function head'

, что, я уверен, означает, что базовый случай пустого списка в моей функции head' отсутствует.Список транспонирован, просто не закрыт.Как мне справиться с этой проблемой в этом случае?У меня есть подозрение, что это может быть связано с Maybe, но у меня возникают проблемы с его реализацией таким образом.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

map - это все, что вам нужно, в дополнение к существующим функциям head и tail.Для простоты предполагается, что входные данные всегда являются непустым списком (т. Е. xs может быть [[],[],[]], но никогда не может быть [], поэтому нет проблем с использованием head или tail.)

> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]
0 голосов
/ 04 января 2019

Вам необходимо добавить условия выхода:

merge [] = []
merge ([]:xss) = merge xss
...