¿Cómo podría implementar un gráfico inductivo en Haskell?

Hay algunas formas de hacerlo, cada una con sus propias ventajas.

Método 1: atar nudos

Importar datos. Función (activada)
importar datos Lista

newtype Graph a = Graph (a, [Graph a])

makeGraph [] = Nada
makeGraph [correo electrónico protegido] ((a, _): _) = let
p = mapa (\ (x, y) -> (x, [y])) l ++
mapa (\ (_, y) -> (y, [])) l
m = mapa (\ (x, c) ->
Gráfico (x, [r |
y <- c,
Solo r y == z) m]
PS
mapa (\ [correo electrónico protegido] ((a, _): _) -> (a, concatMap snd g)) $
groupBy ((==) `on` fst) $
sortBy (compare `on` fst) $
pags
en find (\ (Graph (b, _)) -> b == a) m

Ventajas:

  • Puede navegar por el gráfico simplemente manteniendo una referencia al nodo actual

Desventajas

  • El gráfico no es modificable (si sigue algún ciclo, volverá al gráfico original)
  • La fórmula para `m` también contiene` m`, lo que puede ser confuso para principiantes

Método 2: usar un mapa

importar datos calificados. Mapa como M

makeGraph :: [(a, a)] -> M.Mapa a [a]
mageGraph l = M.fromListWith (++) $
mapa (\ (a, b) -> (a, [b])) l ++
mapa (\ (_, b) -> (b, [])) l

Luego: para encontrar los nodos que siguen a un nodo dado, use la función M.lookup.

Ventajas:

  • Muy simple

Desventajas

  • Cada operación es O (n.log n)

Método 3: usa el ST Monad

Control de importación.
import Control.Monad.ST
Importar datos.
importar datos Lista

newtype Nodo sa = Nodo (STRef s (a, [Nodo sa]))

newNode n = fmap Node $ newSTRef (n, [])
getChildren :: Nodo sa -> ST s [Nodo sa]
getChildren (Nodo r) = fmap snd $ readSTRef r
addChild (Nodo r) x = hacer
(n, c) <- readSTRef r
writeSTRef r (n, x: c)
deleteChild (Nodo r) x = hacer
(n, c) <- readSTRef r
writeSTRef r (n, eliminar xc)
getNodeLabel (Nodo r) = fmap fst $ readSTRef r
relabelNode (Nodo r) n = hacer
(_, c) <- readSTRef r
writeSTRef r (n, c)

makeGraph :: (Ord a) => [(a, a)] -> ST s (Quizás (Nodo sa))
makeGraph [] = return Nada
makeGraph l = do
p do
r <- nuevoNodo n
volver (n, r)
forM_ l $ \ (a, b) -> case (lookup ap, lookpp bp) de
(Solo a ‘, Just b’) -> addChild a ‘b’
_ -> return ()
return $ lookup (fst $ head l) p

Ventajas:

  • Más familiar para las personas que han programado en otros idiomas.
  • Alto rendimiento

Desventajas

  • Más código para configurar todo
  • Requiere una comprensión básica de cómo funciona la mónada ST
  • El gráfico no puede escapar de la mónada.