Собственный метод concat на Haskell с рекурсией - PullRequest
0 голосов
/ 23 октября 2019

Я практикую рекурсию на Haskell, и мне нужно выполнить метод concat с собственным имплементацией во вложенном списке.

Я пробовал

    myConcat :: [[a]] -> [a]
    myConcat [[]] = []
    myConcat ((x:xs)) = x : myConcat ((xs))

Но, похоже, это не работает.

myConcat [[1,2],[3,4,5],[6]] == [1,2,3,4,5,6]

Это цель.

Основная проблема в том, что я действительно не знаю, как работать с вложенными списками.

Ответы [ 2 ]

6 голосов
/ 23 октября 2019

Поскольку x - это список здесь (он имеет тип [a]), вы не можете использовать x : … здесь, если только вы снова не захотите создать список списков, но тогда ваш myConcat будет действовать какid функция для списков.

Вам необходимо добавить x к остальной части списка, чтобы вы могли использовать (++) :: [a] -> [a] -> [a], действительно:

myConcat :: [[a]] -> [a]
myConcat [] = []
myConcat (x:xs) = x ++ myConcat xs

Обратите внимание, что вы забыли базовый вариант []. При написании [[]] вы сопоставляете список с одним элементом : пустым списком. Это что-то другое.

1 голос
/ 23 октября 2019

Привет, тебе просто нужно заменить x : myConcat xs на x ++ myConcat xs

...