我需要一些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的新手,需要帮助才能解决问题。
感谢您的帮助。 亚历
答案 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
然后sequence
:mapM
使用类型为(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