帮助Haskell IO输入

时间:2010-11-14 20:26:20

标签: haskell

我需要一些Haskell类型的帮助...

以下是我正在处理的代码:

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的新手,需要帮助才能解决问题。

感谢您的帮助。 亚历

1 个答案:

答案 0 :(得分: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

这可以使用Applicative:

更简洁地书写
import Control.Applicative
loadManyPeople fs = concat <$> mapM loadPeople fs