问题 操纵monad堆栈


如果我有一堆monad,比如说 IOState 和 Error,以及仅使用的功能 IO 和 Error。怎么会去“中” State 从堆栈monad所以我可以使用我的功能?如果订单是 IOErrorState,我可以用 lift 匹配类型,但我希望能够使用我的函数,如果monad堆栈包含 IO 和 Error 并且可能以其他顺序排列其他monad。例如:

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

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

9128
2018-03-08 00:49


起源



答案:


只需更改类型签名即可 fun 至 fun :: (MonadError String m, MonadIO m) => m ()。它将可用于任何具有a的monad堆栈 String 错误,并且可以执行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

15
2018-03-08 01:25



这太棒了,谢谢! - Marek Sapota


答案:


只需更改类型签名即可 fun 至 fun :: (MonadError String m, MonadIO m) => m ()。它将可用于任何具有a的monad堆栈 String 错误,并且可以执行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

15
2018-03-08 01:25



这太棒了,谢谢! - Marek Sapota