【问题标题】:Manipulating the monad stack操作 monad 堆栈
【发布时间】:2012-03-08 00:49:32
【问题描述】:

如果我有一堆 monad,比如 IOStateError,以及只使用 IOError 的函数。如何从堆栈中“删除”中间的 State monad 以便我可以使用我的函数?如果顺序是IOErrorState,我可以使用lift 来匹配类型,但如果monad 堆栈包含IOError 和可能以任何顺序的其他单子。例如:

fun :: ErrorT String IO ()
fun = throwError "error"

someCode :: ErrorT String (StateT Int IO) ()
someCode = do
    -- I want to use fun here

【问题讨论】:

    标签: haskell monads monad-transformers


    【解决方案1】:

    只需将fun 的类型签名更改为fun :: (MonadError String m, MonadIO m) => m ()。然后它将可用于任何具有String 错误的 monad 堆栈,并且可以执行 IO(例如ErrorT String (StateT Int IO))。

    例如:

    fun :: (MonadError String m, MonadIO m) => m ()
    fun = do
      liftIO $ putStrLn "in fun"
      throwError "error"
    
    someCode :: ErrorT String (StateT Int IO) ()
    someCode = do
      fun
      -- whatever you want
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2011-09-16
      • 2020-09-26
      • 2010-10-12
      • 2021-03-08
      • 2023-03-09
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多