Cha*_*rer 14 monads haskell generic-list monad-transformers
我需要使用list monad转换器.我读过,有潜在问题ListT IO的Control.Monad.List,因为IO是不可交换的,所以我期待在ListT做的权利.但我得到了一些意想不到的行为.
考虑这个简单的测试:
test = runListT $ do
x <- liftList [1..3]
liftIO $ print x
y <- liftList [6..8]
liftIO $ print (x,y)
Run Code Online (Sandbox Code Playgroud)
使用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)
[(),(),(),(),(),(),(),(),()]
Run Code Online (Sandbox Code Playgroud)
使用"ListT右对齐":
Main> test
1
(1,6)
Run Code Online (Sandbox Code Playgroud)
这是"ListT做得对"的问题,还是我只是错误使用它?有首选替代方案吗?
谢谢!
他们说,这可能是作者的内涵
它让列表中的每个元素都有自己的副作用,如果真正检查了列表中的这个元素,那么它只会被"驱逐".
不过我不确定.无论如何,您可以使用此函数对整个列表进行排序:
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
Run Code Online (Sandbox Code Playgroud)
runAll返回列表的类似应该很容易构建.
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)
Run Code Online (Sandbox Code Playgroud)