Как использовать связывание с вложенными монадами?
У меня есть две функции, одна из которых пытается получить токен из веб-службы и может завершиться с ошибкой, а другая пытается использовать этот токен для получения имени пользователя и может завершиться ошибкой.
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
контекст?