I need to use a list monad transformer. I've read that there are potential problems with ListT IO
from Control.Monad.List
, since IO
isn't commutative, so I'm looking at ListT done right. But I'm getting some unexpected behavior.
Consider this simple test:
test = runListT $ do
x <- liftList [1..3]
liftIO $ print x
y <- liftList [6..8]
liftIO $ print (x,y)
Using 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)
[(),(),(),(),(),(),(),(),()]
Using "ListT done right":
Main> test
1
(1,6)
Is this a problem with "ListT done right", or am I just using it wrong? Is there a preferred alternative?
Thanks!
runAll_
idea is quite nice! I was expecting behavior similar to nested for loops with print statements in an imperative language. But if "ListT done right" is lazy, why is it still performing side effects for the heads of the lists? – Intemperance