2010-05-06 9 views
5

Quiero representar un gráfico en Haskell de la siguiente manera:Haskell gráfico de tipo de datos de representación

Para cada nodo Quiero guardar su valor y una lista de nodos adyacentes. El problema con el que estoy teniendo problemas es que quiero que los nodos adyacentes se almacenen como referencias a otros nodos.

Por ejemplo, quiero que el nodo ny se almacene como ("NY" (l p)) donde l y p son nodos adyacentes, y no como ("NY" ("London" "Paris")).
que hemos probado algo como esto:

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]} 

pero me da en error en let. Qué estoy haciendo mal ?

+1

Usted probablemente está acostumbrado a usar ' let' en el indicador de ghci, pero no es necesario en el nivel superior en los programas de haskell reales. –

Respuesta

7

dos problemas:

  1. let es una forma de expresión y al más alto nivel el compilador espera un formulario de declaración.

  2. Necesita un solo nido de enlaces; utilizando tres let s, ha dividido las definiciones en tres ámbitos distintos.

El código siguiente se compila, y cuando pido n1, me sale una impresión cadena infinita como se esperaba:

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

Tenga en cuenta que 'n1' y' n3' son completamente indistinguibles (ya que tienen la misma definición) que, según su aplicación, puede ser un problema con esta representación. –

4

no representaría un gráfico de esta manera. Almacene los nodos en un mapa o una matriz y consúltelos con sus teclas en lugar de señalarlos directamente. Esto sería mucho más fácil de guardar, cargar, mantener y trabajar con.

Para algunos problemas con su actual representación:

Reid Barton comentó:

Tenga en cuenta que n1 y n3 son totalmente indistinguibles (ya que tienen la misma definición) que, dependiendo de su aplicación, puede ser un problema con esta representación.

(no hay is comparación a la de Python en Haskell)

Norman Ramsey notó:

puedo obtener una impresión de cadena infinita

+1

No representaría un gráfico como este también, pero eso es lo que dice mi tarea :) –

+0

@John Retallack: oh. Espero que la próxima pregunta sobre la tarea sea acerca de qué otra manera podrías representar un gráfico. – yairchu

Cuestiones relacionadas