gpt4 book ai didi

haskell - 列出单子(monad)转换器

转载 作者:行者123 更新时间:2023-12-03 22:36:17 26 4
gpt4 key购买 nike

我需要使用列表单子(monad)变压器。我读到 ListT IO 存在潜在问题来自 Control.Monad.List , 自 IO不是可交换的,所以我在看 ListT done right .但我得到了一些意想不到的行为。

考虑这个简单的测试:

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 做得对”的问题,还是我只是用错了?有首选的替代方案吗?

谢谢!

最佳答案

这可能是作者的意图,因为他们说

it lets each element of the list have its own side effects, which only get `excecuted' if this element of the list is really inspected.



不过,我不确定。无论如何,您可以使用此功能对整体进行排序
列表:
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

还有一个类似的 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)

关于haskell - 列出单子(monad)转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9725958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com