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?