• # deux solutions :

    Posté par . 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 :

    main :: IO ()
    main = do
     r <- parseCSVFromFile "laposte_hexasmal.csv"
     r2 <- parseCSVFromFile "listing.csv"
     case (r,r2) of
     (Right cps,Right listing) -> putStrLn . f cps $ listing 
     (Left err, _) -> error $ show err
     (_, Left err) -> error $ show err

    Avec la monade Either

    main :: IO ()
    main = calcul >>= either (error . show) putStrLn -- either est un destructeur de Either
    -- calcul :: IO (Either Text.Parsec.Error.ParseError String)
    calcul = do
     r <- parseCSVFromFile "laposte_hexasmal.csv" -- tu fais tes IO
     r2 <- parseCSVFromFile "listing.csv" -- là aussi
     return $ do cps <- r -- les résultats de tes IO sont monadiques
     listing <- r2 -- tu peux t'en servir pour monader
     return $ f cps listing

    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.