Es bastante fácil representar un árbol o una lista en Haskell utilizando tipos de datos algebraicos. Pero, ¿cómo harías para representar tipográficamente un gráfico? Parece que necesitas tener punteros. Supongo que podrías tener algo como
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
Y eso sería viable. Sin embargo, se siente un poco desacoplado; Los enlaces entre diferentes nodos en la estructura realmente no "se sienten" tan sólidos como los enlaces entre los elementos actuales anteriores y siguientes en una lista, o los padres e hijos de un nodo en un árbol. Tengo el presentimiento de que realizar manipulaciones algebraicas en el gráfico, tal como lo definí, se vería obstaculizado por el nivel de indirección introducido a través del sistema de etiquetas.
Es principalmente este sentimiento de duda y percepción de inelegancia lo que me hace hacer esta pregunta. ¿Existe una forma mejor / más matemáticamente elegante de definir gráficos en Haskell? ¿O me he topado con algo inherentemente duro / fundamental? Las estructuras de datos recursivas son dulces, pero esto parece ser otra cosa. Una estructura de datos autorreferencial en un sentido diferente a cómo los árboles y las listas son autorreferenciales. Es como si las listas y los árboles fueran autorreferenciales a nivel de tipo, pero los gráficos son autorreferenciales a nivel de valor.
Entonces, ¿qué está pasando realmente?
fgl
paquete se desarrolló a partir de esto.