Como usar o bind com mônadas aninhadas?

Eu tenho duas funções, uma que tenta obter um token de um serviço da web e pode falhar e outra que tenta usar esse token para obter o nome de usuário e pode falhar.

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

Gostaria de pegar o resultado do getToken e alimentá-lo paragetUsername. Se houvesse apenasIO ouMaybe, Eu poderia simplesmente usar o bind, mas como existem mônadas aninhadas, não posso. Como posso escrever algo equivalente agetToken >>= getUsername :: IO (Maybe String) ?

De maneira mais geral, qual função tem o tipom1 m2 a -> (a -> m1 m2 b) -> m1 m2 b?

Pergunta de bônus: como eu faria isso usando a notação do em umIO contexto?

questionAnswers(2)

yourAnswerToTheQuestion