2010-05-06 8 views
5

je veux représenter un graphique dans Haskell de la manière suivante:données Haskell graphique de représentation de type

Pour chaque nœud Je souhaite stocker sa valeur et une liste de noeuds adjacents. Le problème que je rencontre des difficultés est que je veux que les nœuds adjacents soient stockés comme références aux autres nœuds. Par exemple, je souhaite que le nœud ny soit stocké sous la forme ("NY" (l p)) où l et p sont des nœuds adjacents, et non pas ("NY" ("London" "Paris")).
J'ai essayé quelque chose comme ceci:

data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        }deriving (Show) 

let n1 = Node {value=1, neighbors=[n2]} 
let n2 = Node {value=1, neighbors=[n1 n3]} 
let n3 = Node {value=1, neighbors=[n2]} 

Mais je reçois en erreur let. Qu'est-ce que je fais mal ?

+1

Vous êtes probablement habitué à utiliser ' Let à l'invite ghci, mais ce n'est pas nécessaire au plus haut niveau dans les programmes de haskell réels. –

Répondre

7

Deux problèmes:

  1. let est une forme d'expression et au plus haut niveau du compilateur attend un formulaire de déclaration.

  2. Vous avez besoin d'un simple nid de fixations; En utilisant trois let, vous avez divisé les définitions en trois portées distinctes.

Le code suivant compile, et quand je demande n1, j'obtenir une copie papier de chaîne infinie comme prévu:

module Letnest 
where 
data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        } deriving (Show) 

n1 = Node {value=1, neighbors=[n2]} 
n2 = Node {value=1, neighbors=[n1, n3]} 
n3 = Node {value=1, neighbors=[n2]} 
+3

Notez que 'n1' et' n3' sont complètement indiscernables (puisqu'ils ont la même définition) ce qui, selon votre application, peut être un problème avec cette représentation. –

4

Je ne représenterait pas un graphique de cette façon. Stockez les noeuds dans une carte ou un tableau et faites-y référence par leurs touches au lieu de pointer directement sur eux. Ce serait beaucoup plus facile de sauvegarder, charger, maintenir et travailler avec.

Pour certains problèmes avec votre représentation actuelle:

Reid Barton a commenté:

Notez que n1 et n3 sont totalement impossibles à distinguer (car ils ont la même définition) qui, en fonction de votre application, peut être un problème avec cette représentation.

(il n'y a pas de comparaison is un Python la Haskell)

Norman Ramsey a remarqué:

j'obtenir une copie papier chaîne infinie

+1

Je ne représenterais pas un graphique comme celui-ci aussi, mais c'est ce que dit mon devoir :) –

+0

@ John Retallack: oh. J'espère que la prochaine question sur les devoirs concerne la façon dont vous pourriez représenter un graphique. – yairchu

Questions connexes