2012-03-15 19 views
14

Necesito usar un transformador de mónada de lista. He leído que hay problemas potenciales con ListT IO desde Control.Monad.List, ya que IO no es conmutativo, entonces estoy buscando ListT done right. Pero estoy teniendo un comportamiento inesperado.list monad transformer

considerar esta simple prueba:

test = runListT $ do 
    x <- liftList [1..3] 
    liftIO $ print x 
    y <- liftList [6..8] 
    liftIO $ print (x,y) 

Usando Control.Monad.List:

Main> test 
1 
(1,6) 
(1,7) 
(1,8) 
2 
(2,6) 
(2,7) 
(2,8) 
3 
(3,6) 
(3,7) 
(3,8) 
[(),(),(),(),(),(),(),(),()] 

El uso de "ListT hecho justo":

Main> test 
1 
(1,6) 

Es esto un problema " ListT hecho bien ", ¿o lo estoy usando mal? ¿Hay una alternativa preferida?

Gracias!

Respuesta

8

Esto podría ser intencional por parte del autor, ya que dicen

que permite a cada elemento de la lista tiene sus propios efectos secundarios, que sólo se les `excecuted' Si este elemento de la lista es realmente inspeccionado

No estoy seguro, sin embargo. De todos modos, puede utilizar esta función para secuenciar toda la lista :

runAll_ :: (Monad m) => ListT m a -> m() 
runAll_ (ListT m) = runAll_' m where 
    runAll_' m = do 
     mm <- m 
     case mm of 
      MNil   -> return() 
      _ `MCons` mxs -> runAll_' mxs 

Y un análogo runAll que devuelve una lista debe ser fácil de construir.

main = runAll_ $ do 
    x <- liftList [1..3] 
    liftIO $ print x 
    y <- liftList [6..8] 
    liftIO $ print (x,y) 

1 
(1,6) 
(1,7) 
(1,8) 
2 
(2,6) 
(2,7) 
(2,8) 
3 
(3,6) 
(3,7) 
(3,8) 
+0

Hmm, vale, esto tiene sentido, y su idea 'runAll_' es bastante agradable. Esperaba un comportamiento similar al anidado para bucles con declaraciones de impresión en un lenguaje imperativo. Pero si "ListT made right" es flojo, ¿por qué sigue produciendo efectos secundarios para los encabezados de las listas? –

+0

Supone que siempre quiere al menos el primer elemento, por lo que ajusta la "lista completa" en 'm', y también ajusta el cdr en' m'; el auto no está envuelto. Si secuencia la "lista completa", expone solo el automóvil. – Owen