Perché ho semplificato troppo nel mio other question prima, vorrei dare un esempio più chiaro qui.Elegante caso di haskell/gestione degli errori nelle monadi sequenziali
Come posso gestire le situazioni in cui devo verificare le condizioni di certian in modo sequenziale senza annidare più casi? Con "modo sequenziale" intendo ottenere un valore (ad esempio da stdin), controllando questo valore per una determinata condizione e in base al risultato che ottiene un altro valore e così via.
Esempio:
sequen :: IO String
sequen = do
a <- getLine
case a of
"hi" -> do
putStrLn "hello!"
b <- getLine
case b of
"how are you?" -> do
putStrLn "fine, thanks"
return "nice conversation"
_ -> return "error 2"
_ -> return "error 1"
So che ci sono modi migliori per scrivere una chiacchierata bot, si deve solo dimostrare la natura sequenziale del problema. Come puoi vedere, con ogni caso annidato, il codice diventa anche più rientrato.
C'è un modo per strutturare meglio tale codice? Sto pensando di gestire gli "errori" in un punto e di descrivere il "percorso di successo" senza la gestione degli errori distribuita su di esso.
Fantastico. Esattamente quello che volevo sapere. Grazie! –
Sulla nota di EitherT, ho scritto un post su questo blog che è stato abbastanza ben accolto: http://ocharles.org.uk/blog/posts/2012-07-24-in-praise-of-EitherT.html – ocharles
@ocharles ho letto che qualche tempo fa e ho pensato che dovrebbe essere la soluzione al mio problema, ma non ho potuto applicarlo fino ad ora. È possibile collegare a questa domanda nel proprio post :) –