结合 RWST 和 IO

Combining RWST and IO

我需要在 RWS 中执行 IO 操作,所以我决定将 RWST 与 IO monad 结合起来。虽然一切正常,但我无法从外部 monad 获取日志。

这是我目前拥有的:

newtype VM2 a = VM2{
    unwrapVM :: RWST () () () IO a } 
deriving (Functor, Applicative, Monad, MonadIO)

runVmEval :: VM2 a -> IO () 
runVmEval m = do 
                evalRWST (run) () ()
                putStrLn $ "End"

test :: IO () 
test = do
         putStrLn "Start"
         runVmEval $ return ()

run :: RWST () [String] () IO () 
run = do 
        x <- lift getLine
        tell $ [x]
        lift (print x)

这就是我想做的事情:

runVmEval :: VM2 a -> IO ()
runVmEval m = do
    let w = evalRWST (run) () ()
    putStrLn $ snd w
    putStrLn $ "End"

这显然失败了,因为 w 的类型是 IO ((), [String])

我也试过以下方法:

runVmEval :: VM2 a -> IO ()
runVmEval m = do
    let (a,w) = evalRWST (run) () ()
    putStrLn $ "End"
    mapM_ (putStrLn) $ snd w

但我不断收到上述类型错误...

有什么想法吗?

只需使用绑定而不是 let

runVmEval m = do
    (a,w) <- evalRWST run () ()
    putStrLn "End"
    mapM_ putStrLn w