2015-10-16 11 views
8

Come spiegato sul mio previous question, non è possibile distinguere due grafici creati usando la strategia del nodo se non si dispone di una sorta di etichetta univoca sui nodi. Utilizzando un grafico a due tagli come esempio:Esiste un modo per un modo conveniente di esprimere i grafici usando la strategia del nodo?

data Node = Node Int Node Node 

square = a where 
    a = Node 0 b c 
    b = Node 1 a d 
    c = Node 2 a d 
    d = Node 3 b c 

scrittura square questo modo è un po 'scomodo e soggetto ad errori a causa della necessità di scrivere manualmente etichette. Questo tipo di modello di solito richiedono una monade:

square = do 
    a <- Node b c 
    b <- Node a d 
    c <- Node a d 
    d <- Node b c 
    return a 

Ma anche questo non può essere fatto da monadi sono sequenziali. C'è un modo conveniente per scrivere i grafici del nodo?

+0

GIven [altra mia risposta] (http://stackoverflow.com/a/33337598/477476), forse per il vostro caso d'uso particolare, legare il nodo potrebbe essere il modo più conveniente! – Cactus

risposta

10
{-# LANGUAGE RecursiveDo #-} 

import Control.Monad.State 

type Intividual a = State Int a 

data Node = Node Int Node Node 

newNode :: Node -> Node -> Intividual Node 
newNode a b = state $ \i -> (Node i a b, succ i) 

square :: Node 
square = (`evalState`0) $ mdo 
    a <- newNode b c 
    b <- newNode a d 
    c <- newNode a d 
    d <- newNode b c 
    return a 
+0

'RecursiveDo', okay, penso di averne sentito parlare un giorno. Grazie per la tua risposta ... posso modificare una breve spiegazione su di essa? – MaiaVictor

Problemi correlati