Как представить граф в Haskell?

Достаточно просто представить дерево или список в Haskell, используя алгебраические типы данных. Но как бы вы типографски представили график? Кажется, что вам нужно иметь указатели. Я предполагаю, что у вас может быть что-то вроде

type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours

И это будет работать. Однако он кажется немного развязанным; Связи между различными узлами в структуре на самом деле не «кажутся» такими прочными, как связи между текущими предыдущими и следующими элементами в списке или родительскими и дочерними элементами узла в дереве.У меня есть предчувствие, что выполнение алгебраических манипуляций с графом, как я его определил, будет несколько затруднено из-за уровня косвенности, введенного через систему тегов.

В первую очередь это чувство сомнения и восприятие неэлегантности заставляет меня задать этот вопрос. Есть ли лучший/более математически элегантный способ определения графиков в Haskell? Или я наткнулся на что-то изначально сложное/фундаментальное? Рекурсивные структуры данных хороши, но это, кажется, что-то другое. Самореферентная структура данных в другом смысле, чем самореферентность деревьев и списков. Это похоже на то, что списки и деревья являются самореферентными на уровне типов, но графы являются самореферентными на уровне значений.

Так что же происходит на самом деле?

118
задан TheIronKnuckle 16 March 2012 в 04:53
поделиться