如果我有一堆monad,比如说 IO, State 和 Error,以及仅使用的功能 IO 和 Error。怎么会去“中” State 从堆栈monad所以我可以使用我的功能?如果订单是 IO, Error, State,我可以用 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
只需更改类型签名即可 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
只需更改类型签名即可 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