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!
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? –
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