Как использовать связывание с вложенными монадами?

У меня есть две функции, одна из которых пытается получить токен из веб-службы и может завершиться с ошибкой, а другая пытается использовать этот токен для получения имени пользователя и может завершиться ошибкой.

getToken :: IO (Maybe Token)
getUsername :: Token -> IO (Maybe String)

Я хотел бы взять результат getToken и скормить егоgetUsername, Если бы было толькоIO или жеMaybeЯ мог бы просто использовать связывание, но так как есть вложенные монады, я не могу. Как я могу написать что-то эквивалентноеgetToken >>= getUsername :: IO (Maybe String) ?

В общем, какая функция имеет типm1 m2 a -> (a -> m1 m2 b) -> m1 m2 b?

Бонусный вопрос: как бы я это сделал, используя нотацию do вIO контекст?

Ответы на вопрос(1)

Ваш ответ на вопрос