Ho solo mantenuto il set visitato come un set e lo passo come parametro. Esistono implementazioni efficienti in tempo di registrazione di insiemi di qualsiasi tipo ordinato e insiemi di numeri interi estremamente efficienti.
Per rappresentare un grafico, utilizzo elenchi di adiacenza, o userò una mappa finita che mappa ciascun nodo in un elenco dei suoi successori. Dipende da cosa voglio fare.
Piuttosto che Abelson e Sussman, consiglio a Chris Okasaki di Purely Functional Data Structures. Mi sono collegato alla tesi di Chris, ma se hai i soldi, li ha espansi in un excellent book.
Solo per sorrisi, ecco una inversione postorder di ricerca un po 'paura in profondità fatto in stile continuazione-passing in Haskell. Questo è direttamente fuori dalla biblioteca Hoopl ottimizzatore:
postorder_dfs_from_except :: forall block e . (NonLocal block, LabelsPtr e)
=> LabelMap (block C C) -> e -> LabelSet -> [block C C]
postorder_dfs_from_except blocks b visited =
vchildren (get_children b) (\acc _visited -> acc) [] visited
where
vnode :: block C C -> ([block C C] -> LabelSet -> a)
-> ([block C C] -> LabelSet -> a)
vnode block cont acc visited =
if setMember id visited then
cont acc visited
else
let cont' acc visited = cont (block:acc) visited in
vchildren (get_children block) cont' acc (setInsert id visited)
where id = entryLabel block
vchildren bs cont acc visited = next bs acc visited
where next children acc visited =
case children of [] -> cont acc visited
(b:bs) -> vnode b (next bs) acc visited
get_children block = foldr add_id [] $ targetLabels bloc
add_id id rst = case lookupFact id blocks of
Just b -> b : rst
Nothing -> rst
fonte
2010-06-08 22:58:32
Ho tirato questi link dalla pagina della libreria grafico funzionale: Questo spiega la teoria: http://web.engr.oregonstate.edu/~erwig/papers/abstracts.html#JFP01 Questo documenta i dettagli di programmazione: http://web.engr.oregonstate.edu/~erwig/fgl/haskell/old/fgl0103.pdf Insieme, questi documenti rispondono meglio alla mia domanda, in particolare la seconda, che è un po 'più pratica. Grazie! – brad