Если у меня есть стек монад, скажем, IO
, State
и Error
и функция, которая использует только IO
и Ошибка
. Как можно «удалить» среднюю монаду State
из стека, чтобы я мог использовать свою функцию? Если порядок был IO
, Error
, State
, я мог бы использовать lift
для сопоставления типов, но я хочу иметь возможность используйте мою функцию, если стек монад содержит IO
и Error
и, возможно, другие монады в любом порядке. Например:
fun :: ErrorT String IO ()
fun = throwError "error"
someCode :: ErrorT String (StateT Int IO) ()
someCode = do
-- I want to use fun here