В настоящее время я играю с LISP (особенно Scheme и Clojure), и мне интересно, как обрабатываются типичные структуры данных в функциональных языках программирования.
Например, скажем, я хотел бы решить проблему, используя алгоритм поиска пути к графу. Как обычно можно представить этот граф на функциональном языке программирования (в первую очередь интересующемся чисто функциональным стилем, который можно применять к LISP)? Могу ли я просто забыть о графиках и решить проблему другим способом?
Функциональные языки работают со структурами данных так же, как нефункциональные языки: отделяя интерфейс от реализации, создавая абстрактные типы данных.
Вы можете создавать абстрактные типы данных в Лиспе. Например, для графа вам может потребоваться пара функций:
Создав этот интерфейс для графа, вы можете реализовать фактические структуры данных различными способами, возможно, оптимизируя такие факторы, как эффективность программиста, гибкость и вычислительная эффективность.
Ключ должен гарантировать, что код, который использует графики, использует только интерфейс графа и не имеет доступа к базовой реализации. Это сделает код клиента проще, поскольку он не связан с реальной реализацией.
источник
Ну, это будет зависеть от того, является ли ваш граф направленным / ненаправленным, взвешенным / невзвешенным, но один способ представления ориентированного, взвешенного графа (который был бы наиболее общим) - с помощью карты карт (в Clojure)
будет представлять карту с узлами: a: b и: c. : a указывает на: b с весом 3 и: c с весом 4.: b указывает на: a с весом 1.: c ни на что не указывает.
источник
В Common Lisp, если бы мне нужно было представить дерево, я бы использовал либо список (если бы он был просто для быстрого взлома), либо определял класс дерева (или структуру, но классы хорошо взаимодействуют с универсальными функциями, так почему бы и нет) ,
Если мне нужны литеральные деревья в коде, я бы, вероятно, также определил
make-tree
функцию, которая принимает представление списка нужного мне дерева и превращает его в дерево объектов дерева.источник
В Haskell список является базовой структурой данных, и если вам нужны более сложные структуры данных, вы часто используете рекурсивные структуры, например, дерево является либо нулевым, либо узлом и двумя деревьями.
источник