Comment représenter un graphe en Haskell?

Il est assez facile de représenter un arbre ou une liste dans haskell en utilisant des types de données algébriques. Mais comment vous y prendriez-vous à la typographie représentant un graphique? Il semble que vous avez besoin d'avoir des pointeurs. Je devine que vous pourriez avoir quelque chose comme

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

Et qui serait réalisable. Cependant, il se sent un peu découplé; les liens entre Les différents nœuds de la structure n'est pas vraiment "sentir" aussi solide que les liens entre le précédent et suivant des éléments dans une liste, ou les parents et les enfants d'un nœud dans un arbre. J'ai un pressentiment que faire des manipulations algébriques sur le graphe que j'ai défini, il serait quelque peu entravée par le niveau d'indirection introduit par le système de tag.

C'est surtout ce sentiment de doute et de la perception de inelegance qui me fait poser cette question. Est-il mieux/plus mathématiquement élégante manière de définir les graphiques en Haskell? Ou ai-je tombé sur quelque chose d'intrinsèquement dur/fondamental? Récursive structures de données sont doux, mais cela semble être quelque chose d'autre. Un auto-référentielle de la structure des données dans un sens différent de la façon dont les arbres et les listes sont auto référentielle. C'est comme les listes et les arbres sont autoréférentiels au niveau du type, mais les graphiques sont auto-référentielle à la valeur de niveau.

Donc ce qui se passe vraiment?

  • Vous pourriez être intéressé par Martin Erwig du papier sur les algorithmes sur les graphes: web.engr.oregonstate.edu/~erwig/documents/abstracts.html#JFP01. Le fgl package développé à partir de ce.
  • Le 99 Haskell problèmes de la page montre quelques exemples de graphiques utilisés dans un contexte de résolution de problème. Il a également une courte introduction sur les différentes représentations.