结合 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
我需要在 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