2010-11-09 2 views
3

Я начинаю с Haskell, и мне трудно понять какой-то код. Что мне нужно сделать, чтобы получить типы прямо в этой секции ввода-вывода моего кода?Haskell IO код не typecheck

Заранее спасибо.

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 подчеркнуты красным Leksah, и ошибка компиляции я получаю это:

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

Вы могли бы устранить «getLines» е с помощью функторов (см .: http://learnyouahaskell.com/functors-applicative-functors-and-monoids). Вы можете сделать: «ls <- fmap lines $ readFile file" – Daniel

ответ

9

map parsePerson lines имеет тип [Person], но так как вам нужно тип результата loadPeople является IO [Person], что вам нужно обернуть его в IO с помощью return:

return $ map parsePerson lines 
+0

ДА! Благодарю. Это создает общий смысл, теперь, когда я об этом думаю. –

+0

Серьезно поздний комментарий: Лучше написать это как 'liftM (parsePerson lines) $ getLines file'. Имейте в виду, что всякий раз, когда у вас есть две линейные монадические функции, обычно лучше их написать. – alternative