14
我需要使用列表monad變壓器。我讀到ListT IO
從Control.Monad.List
有潛在的問題,因爲IO
是不可交換的,所以我在看ListT done right。但是我收到了一些意想不到的行爲。列表monad變壓器
考慮這個簡單的測試:
test = runListT $ do
x <- liftList [1..3]
liftIO $ print x
y <- liftList [6..8]
liftIO $ print (x,y)
使用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)
[(),(),(),(),(),(),(),(),()]
使用 「ListT這樣做的權利」:
Main> test
1
(1,6)
這是一個問題「 ListT做對了「,還是我只是用它錯了?有一個首選的替代方案嗎?
謝謝!
嗯,好的這是有道理的,你的'runAll_'主意非常好!我期待的行爲類似於使用命令式語言的print語句的嵌套for循環。但是,如果「ListT做對了」是懶惰的,爲什麼它仍然在對列表頭進行副作用? – 2012-03-15 19:49:20
假設你總是至少需要第一個元素,所以它將「整個列表」包裝在'm'中,並且將cdr包裝成'm';汽車沒有被包裹。如果你排列「整個列表」,它只會暴露汽車。 – Owen 2012-03-15 19:52:11