как реализовать эту глубокую копию в стиле функционального программирования?

Учитывая следующую структуру:

class G {
    Node[] nodes;
}
class Node {
    Node neighbour;
}

Операции глубокого копирования можно определить как:

function G copy (G g) {
    G r = new G();
    Map isom = new Map();
    for (Node node in g.nodes) {
        Node c = isom.get(node);
        if (c == null) {
            c = copy(node, isom);
            isom.put(node, c);
        }
        r.nodes.add(c);
    }
    return r;
}
function Node copy(Node n, Map isom) {
    Node r = isom.get(n);
    if (r == null) {
        r = new Node();
        isom.put(n, r);
        r.neighbour = copy(n.neighbour);
    }
    return r;
}

Мой вопрос заключается в том, как спроектировать функцию copy(Node n, Map isom), чтобы она не изменяла аргумент isom в стиле функционального программирования.


person 象嘉道    schedule 22.10.2012    source источник
comment
В чистом FP ​​вы не копируете, вы делитесь.   -  person Fred Foo    schedule 23.10.2012


Ответы (1)


После публикации этого вопроса я серьезно провел некоторые исследования. Я пришел к выводу, что функциональное программирование плохо справляется с популярными графовыми алгоритмами.

Люди с чисто функциональными предпочтениями должны относиться к графу иначе, чем к обычной литературе. Это мотивация подтолкнуть ребят к созданию следующих работ:

  • алгоритмы функционального графа с поиском в глубину
  • граф алгоритм ленивый функциональный язык программирования
  • индуктивные графы и алгоритмы функциональных графов
  • чисто функциональные структуры данных
  • графовые алгоритмы с функциональным привкусом

Алгоритмы графов долгое время были проблемой для программирования на чистом функциональном языке. Предыдущие попытки были либо нечитаемыми, либо не смогли достичь стандартных показателей асимптотической сложности.

---Джон Лаунчбери. 1995. Графические алгоритмы с функциональным ароматом. В «Продвинутом функциональном программировании», Первая международная весенняя школа по продвинутым методам функционального программирования — текст учебника, Йохан Джеринг и Эрик Мейер (ред.). Springer-Verlag, Лондон, Великобритания, 308–331.

person 象嘉道    schedule 23.10.2012