Легко представить дерево или список в haskell, используя алгебраические типы данных. Но как вы относитесь к типографическому представлению графа? Кажется, что вам нужны указатели. Я предполагаю, что у вас может быть что-то вроде
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
И это будет работоспособным. Однако он чувствует себя немного разъединенным; Связи между различными узлами в структуре на самом деле не "чувствуют" столь же прочные, как связи между текущими предыдущими и последующими элементами в списке, или родителями и дочерними элементами node в дереве. У меня есть догадка, что выполнение алгебраических манипуляций на графике, как я определил, будет несколько затруднено уровнем косвенности, введенной через систему тегов.
В первую очередь это чувство сомнения и восприятия неэффективности заставляет меня задавать этот вопрос. Есть ли лучший/более математически элегантный способ определения графиков в Haskell? Или я наткнулся на что-то неотъемлемо тяжелое/фундаментальное? Рекурсивные структуры данных сладки, но это похоже на что-то другое. Самореферентная структура данных в другом смысле, как деревья и списки являются самореальными. Это, как списки и деревья, являются самореляционными на уровне типа, но графики являются самореляционными на уровне значений.
Так что же происходит?