"单子允许程序员使用连续的构建块来构建计算",因此它允许我们组合一些计算。如果是这样,那么为什么下面的代码不能运行?
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.."
为什么我们不能将不同的函数放在一个单子中(就像上面的例子)?
为什么我们需要一个额外的层,即变换器来组合单子?
execStateT
和evalStateT
在这里都返回一个IO String
,您可能想打印其中的String
。=<<
会使用右侧单子内部的值调用左侧的函数。 - 4castlemain = do x <- execStateT gt "W.." ; print x ; y <- evalStateT gt "W.." ; print y
- chi