main::IO()main=calcul>>=either(error.show)putStrLn-- either est un destructeur de Either-- calcul :: IO (Either Text.Parsec.Error.ParseError String)calcul=dor<-parseCSVFromFile"laposte_hexasmal.csv"-- tu fais tes IOr2<-parseCSVFromFile"listing.csv"-- là aussireturn$docps<-r-- les résultats de tes IO sont monadiqueslisting<-r2-- tu peux t'en servir pour monaderreturn$fcpslisting
Sauf erreur de ma part, tu peux pas utiliser de tranformeurs car la monade IO est nécessairement au fond de la pile de monade. Un transformeur mT ne peut que produire une monade IO, là il faudrait une monade IOT qui produit un calcul dans Either
si ça existait il serait possible de sortir de la monade IO, (tu aurais une fonction de type (IO (m a) -> m a), c'est pas bon.
# deux solutions :
Posté par foobarbazz . En réponse au message Haskell : simplifier 2 "case" imbriqués. Évalué à 2. Dernière modification le 12 mai 2016 à 15:49.
Deux solutions :
Tu peux fusionner les deux case, ça change légèrement la sémantique vis à vis des exceptions :
Avec la monade Either
Sauf erreur de ma part, tu peux pas utiliser de tranformeurs car la monade IO est nécessairement au fond de la pile de monade. Un transformeur mT ne peut que produire une monade IO, là il faudrait une monade IOT qui produit un calcul dans Either
si ça existait il serait possible de sortir de la monade IO, (tu aurais une fonction de type (IO (m a) -> m a), c'est pas bon.