“Monad允许程序员使用顺序构建块来构建计算”,因此它允许我们组合一些计算。如果是这样的话,为什么不能运行下面的代码?
import Control.Monad.Trans.State
gt :: State String String
gt = do
name <- get
putStrLn "HI" -- Here is the source of problem!
put "T"
return ("hh..." ++ name ++ "...!")
main= do
print $ execState gt "W.."
print $ evalState gt "W.."发布于 2017-07-13 13:55:56
monad变压器是将不同的功能放在一个单机上的机制。
一个单子只知道如何组合计算,这是在该单一的能力范围内。您不能在State monad中执行I/O操作,但可以在StateT s IO a monad中执行I/O。但是,在进行I/O的计算时,需要使用liftIO。
import Control.Monad.Trans.State
import Control.Monad.IO.Class (liftIO)
gt :: StateT String IO String
gt = do
name <- get
liftIO $ putStrLn "HI"
put "T"
return ("hh..." ++ name ++ "...!")
main = do
print =<< execStateT gt "W.."
print =<< evalStateT gt "W.."https://stackoverflow.com/questions/45082178
复制相似问题