URL: https://linuxfr.org/forums/programmationautre/posts/haskell-simplifier-2-case-imbriques Title: Haskell : simplifier 2 "case" imbriqués Authors: max22 Date: 2016年05月12日T11:49:16+02:00 License: CC By-SA Tags: haskell Score: 1 Bonjour, je viens de coder un petit truc vite fait en Haskell pour remplir des noms de ville à partir de codes postaux dans un fichier CSV. Ca marche, mais j'aimerais simplifier ma fonction "main" qui contient 2 "case" imbriqués, à cause de la fonction parseCSVFromFile qui a pour type : ```haskell parseCSVFromFile :: FilePath -> IO (Either ParseError CSV) ``` Je fais donc la gestion d'erreur à la main, mais vu que Either est une monade, j'aimerais que ça soit fait automatiquement. Et le fait que le Either soit encapsulé dans un IO complique un peu les choses. J'ai essayé d'utiliser liftM, mais je n'ai pas réussi. Voici le code en question : ```haskell module Main ( main ) where import Text.CSV import qualified Data.Map as Map fromCSV :: CSV -> Map.Map String String fromCSV = Map.fromList . map (\l -> (l!!2, l!!1)) . init . tail fillCity :: Map.Map String String -> Record -> Record fillCity _ l | length l /= 13 = l fillCity m l = [cp] ++ [Map.findWithDefault "" cp m] ++ drop 2 l where cp = head l f :: CSV -> CSV -> String f cps = printCSV . map (fillCity $ fromCSV cps) main :: IO () main = do r <- parseCSVFromFile "laposte_hexasmal.csv" case r of Left err -> error (show err) Right cps -> do r2 <- parseCSVFromFile "listing.csv" case r2 of Left err -> error (show err) Right listing -> putStrLn . f cps $ listing ```

AltStyle によって変換されたページ (->オリジナル) /