У меня есть воображаемый список с различными уровнями вложенности или игнорирования уродливых типов ответа API, например:
a ::(Num a, Num [a], Num [[a]]) => [[a]]
a = [1, 2, [3, 4]]
b :: (Num a, Num [a], Num [[a]], Num [[[a]]]) => [[[[a]]]]
b = [[1,2,[3]],4]
Функция, которую я пытаюсь создать, должна делать следующее:
myFunc a == [1,2,3,4]
myFunc b == [1,2,3,4]
Первоначально я думал, что мне придется проанализировать список в AST (абстрактное синтаксическое дерево) -->
использовать рекурсию, чтобы сгладить все ветви и уйти в одну ветку -->
проанализировать результат обратно в список.
Я не уверен, как разобрать список в AST? или есть лучшее решение?
edit - я думаю, что я пытался быть слишком буквальным, потому что представление [1, 2, [3, 4]]
на самом деле является частью проблемы, поэтому для того, чтобы вещи работали лучше, их нужно было бы представить в виде ADT / AST. Итак, если бы это был ответ API или чтение файла, как бы я проанализировал эти данные в AST / ADT?