2010-11-14 3 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 и нуждаюсь в помощи в получении типов для разработки.

Спасибо за помощь. Alex

ответ

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 

Это можно записать более кратко, используя Аппликативный:

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

И стоит отметить, что '<$>' просто 'fmap', которые вы можете или не может уже видели. –

+0

спасибо, ребята. Удивительный материал –