É fácil o suficiente representar uma árvore ou lista em haskell usando tipos de dados algébricos. Mas como você representaria tipograficamente um gráfico? Parece que você precisa ter ponteiros. Eu estou supondo que você poderia ter algo como
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
E isso seria viável. No entanto, parece um pouco dissociado; Os links entre diferentes nós na estrutura não "parecem" tão sólidos quanto os links entre os elementos anteriores e seguintes atuais em uma lista, ou os pais e filhos de um nó em uma árvore. Eu tenho um pressentimento de que fazer manipulações algébricas no gráfico, como eu defini, seria um pouco prejudicado pelo nível de indireção introduzido através do sistema de tags.
É principalmente esse sentimento de dúvida e percepção de deselegância que me leva a fazer essa pergunta. Existe uma maneira melhor / mais matematicamente elegante de definir gráficos em Haskell? Ou eu me deparei com algo inerentemente difícil / fundamental? Estruturas de dados recursivas são boas, mas isso parece ser outra coisa. Uma estrutura de dados auto-referencial em um sentido diferente de como as árvores e as listas são auto-referenciais. É como se listas e árvores fossem auto-referenciais no nível de tipo, mas os gráficos são auto-referenciais no nível de valor.
Então, o que realmente está acontecendo?
fgl
pacote foi desenvolvido a partir disso.