Monad vs Monad变形金刚

时间:2017-07-13 13:32:17

标签: haskell monads monad-transformers

" Monads允许程序员使用顺序构建块来构建计算"因此它允许我们组合一些计算。如果是这种情况,那么为什么以下代码无法运行?

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.."
  • 为什么我们不能将不同的函数放在monad中(如上例所示)?

  • 为什么我们需要一个额外的层,即变换器来组合monad?

1 个答案:

答案 0 :(得分:8)

Monad变换器 是将不同函数放入monad的机制。

monad只知道如何组合该monad能力范围内的计算。您不能在State monad中执行I / O,但可以在StateT s IO a monad中执行。但是,您需要对执行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.."