首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monad与Monad变压器

Monad与Monad变压器
EN

Stack Overflow用户
提问于 2017-07-13 13:32:16
回答 1查看 230关注 0票数 4

“Monad允许程序员使用顺序构建块来构建计算”,因此它允许我们组合一些计算。如果是这样的话,为什么不能运行下面的代码?

代码语言:javascript
复制
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.."
  • 为什么我们不能把不同的功能放在一个单一(如上面的例子)?
  • 为什么我们需要一个额外的层,即变压器组合单体?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 13:55:56

monad变压器是将不同的功能放在一个单机上的机制。

一个单子只知道如何组合计算,这是在该单一的能力范围内。您不能在State monad中执行I/O操作,但可以在StateT s IO a monad中执行I/O。但是,在进行I/O的计算时,需要使用liftIO

代码语言:javascript
复制
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.."
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45082178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档