2010-11-09 32 views
3

Je suis un débutant avec Haskell et je n'arrive pas à trouver du code. Que dois-je faire pour obtenir les types sur cette section IO de mon code?Le code IO de Haskell ne correspond pas

Merci d'avance.

loadPeople :: FilePath -> IO [Person] 
loadPeople file = do 
    lines <- getLines file 
    map parsePerson lines 

getLines :: FilePath -> IO [String] 
getLines = liftM lines . readFile 

parsePerson :: String -> Person 
parsePerson line = ........... 

map est souligné en rouge dans Leksah, et l'erreur de compilation que je reçois est:

src\Main.hs:13:3: 
    Couldn't match expected type `IO [Person]' 
      against inferred type `[Person]' 
    In the expression: map parsePerson lines 
    In the expression: 
     do { lines <- getLines file; 
      map parsePerson lines } 
    In the definition of `loadPeople': 
     loadPeople file 
        = do { lines <- getLines file; 
          map parsePerson lines } 
+0

Vous pouvez éliminer les "getLines" f en utilisant Functors (voir: http://learnyouahaskell.com/functors-applicative-functors-and-monoids). Vous pouvez faire: "ls <- fmap lignes $ fichier readFile" – Daniel

Répondre

9

map parsePerson lines est de type [Person], mais étant donné que vous avez besoin du type de résultat loadPeople est IO [Person], vous avez besoin l'envelopper dans IO en utilisant return:

return $ map parsePerson lines 
+0

OUI! Merci. Cela a un sens total, maintenant que j'y pense. –

+0

Sérieusement un commentaire tardif: Mieux vaut écrire cela comme 'liftM (parsePerson lines) $ getLines file'. Gardez à l'esprit que chaque fois que vous avez une fonction monadique à deux lignes, il y a généralement une meilleure façon de l'écrire. – alternative