2010-11-09 25 views
3

我是Haskell的初學者,無法找出一些代碼。我需要做些什麼才能在我的代碼的IO部分獲得正確的類型?Haskell IO代碼不會檢測到

在此先感謝。

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」f通過使用Functors(見:http://learnyouahaskell.com/functors-applicative-functors-and-monoids)。你可以這樣做:「ls < - fmap行$ readFile文件」 – Daniel 2010-11-09 17:34:36

回答

9

map parsePerson lines具有類型[Person],但因爲你需要的loadPeople結果類型爲IO [Person],你需要使用return來包裝IO

return $ map parsePerson lines 
+0

YES!謝謝。這是完全合理的,現在我想到了。 – 2010-11-09 03:13:54

+0

嚴重遲到的評論:最好把它寫成'liftM(parsePerson lines)$ getLines file'。請記住,只要你有兩行monadic函數,它們通常是一個更好的寫法。 – alternative 2011-03-17 00:20:59