Управление стеком монад

Если у меня есть стек монад, скажем, 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
11
задан Marek Sapota 8 March 2012 в 00:49
поделиться