2010-11-14 108 views
4

我需要一些幫助,在Haskell類型...幫助Haskell的IO輸入

這裏是我工作的代碼:

loadManyPeople :: [FilePath] → IO [Person] 
loadManyPeople fs = do 
    return $ concat $ map loadPeople fs 

loadPeople :: FilePath → IO [Person] 
loadPeople file = do 
    lines ← getLines file 
    return $ map parsePerson lines 

loadPeople是罰款。我想讓loadManyPeople從每個文件加載所有人,然後將它們連接到人員列表中。

我是Haskell的新手,需要幫助獲取類型。

感謝您的幫助。 亞歷

回答

12

loadPeople給你一個IO [Person],所以map loadPeople給你一個[IO [Person]],但使用concat,你需要一個[[Person]]

爲了解決這個問題,你可以使用序列,這是[IO a] -> IO [a]類型的功能,這樣你就可以做到以下幾點:

loadManyPeople fs = do 
    manyPeople <- sequence $ map loadPeople fs 
    return $ concat manyPeople 

但是有一個快捷方式使用map然後sequencemapM其類型(a -> IO b) -> [a] -> IO [b]。隨着mapM您的代碼如下所示:

loadManyPeople fs = do 
    manyPeople <- mapM loadPeople fs 
    return $ concat manyPeople 

這可以寫得更簡潔使用應用型:

import Control.Applicative 
loadManyPeople fs = concat <$> mapM loadPeople fs 
+5

而且值得一提的是'<$>'只是'fmap',您可能會或可能不會已經看到了。 – 2010-11-14 20:55:20

+0

謝謝你們。真棒的東西 – 2010-11-14 21:35:17