Я пытаюсь сгладить произвольное количество списков внутри списков в Haskell. Я знаю, что этот вопрос уже был опубликован в Stack, но ответы на них слишком сложны для меня (я новичок в Haskell), или нет ответа, удовлетворяющего мои потребности (например, concat не будет работать для меня, потому что я должен фактически написать эту функцию сглаживания самостоятельно для учебного пособия по экзамену). Я также пишу свою собственную функцию сглаживания в Haskell, чтобы понять, почему в топ-решениях используются модули.Сглаживание списка в Haskell
Вот что у меня есть.
flatten :: [[a]] -> [a]
flatten [] = []
flatten (x:xs) = flatten x:flatten xs
Однако я получаю сообщение об ошибке:
Inferred type is not general enough
*** Expression : flatten
*** Expected type : [[a]] -> [a]
*** Inferred type : [[[a]]] -> [[a]]
EDIT: Извините! Я неправильно понял вопрос об экзамене. Все элементы списка на самом деле должны быть списками. Например, [[[1,2,3], [4,5,6]], [7,8,9]]
, а не [1, [2,3,4]]
.
Попробуйте определить тип вашей функции. У вашего определения есть конфликты в типах. –
Хмм, поэтому я определил его как 'flatten :: [a] -> [a]', но он жалуется, что '[a] -> [[a]]' не соответствует '[a] -> [a]' и все же, объединение дало бы бесконечный тип. Почему это? – dtgee
Боюсь, что вам нравится сгладить список, подобный '[1, [2,3]]', который не является правильно напечатанным списком в первую очередь. Это действительно дерево, и вам нужно будет 'datatype', чтобы определить его. –