如果我有一堆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