Если у меня есть стек монад, скажем IO
, State
и Error
, и функция, которая использует только IO
и Error
.Как можно было бы «удалить» среднюю 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