Предположим, что у меня есть дерево, представленное как список родителей, и я хочу повернуть ребрами, получив список дочерних элементов для каждого узла. Для этого дерева - http://i.stack.imgur.com/uapqT.png - преобразование будет выглядеть следующим образом:Что такое «путь Haskell» для транспонирования графика?
[0,0,0,1,1,2,5,4,4] -> [[2,1],[4,3],[5],[],[8,7],[6],[],[],[]]
Но это не ограничивается графиком Транспонирования, однако. У меня есть несколько других проблем, которые я бы решила на императивном языке следующим образом: пересекайте некоторый массив исходных данных и не последовательно обновляйте результирующий массив, когда я узнаю что-то об этом.
По существу, мой вопрос: «Что такое идиоматический способ Хаскелла разрешить такие вещи?». Насколько я понимаю, я могу сделать это императивно с помощью изменчивых векторов, но разве нет какого-то чисто функционального метода? Если нет, то как правильно использовать mutables?
И, наконец, мне нужно, чтобы он работал быстро, то есть O (n) сложность и нестандартные пакеты для меня не являются опцией.
Что вы подразумеваете под стандартным пакетом? 'база 'или, возможно, платформа Haskell? –
@ AndrásKovács Платформа Haskell. Я имел в виду, что я не могу забросить, например, что-нибудь дополнительное. – Norrius
(Исканный способ Haskell состоит в том, чтобы хранить дерево как дерево, а не массив, сериализовать данные с помощью стандартного обхода, поэтому его легко де-сериализировать, и пусть компилятор сортирует указатели, а не взламывает их вручную. массив ввода массива и выход массива, почему вы хотите избежать обработки массива?) – AndrewC