2013-02-19 5 views
1

В настоящее время у меня есть этот код, который будет выполнять функцию main' для каждого из имен файлов в списке files.Использование mapM f [список], где f определяется с помощью нотации

В идеале я пытался совместить main и main', но я не достиг большого прогресса. Есть ли лучший способ упростить это или мне нужно будет их разделить?

{- Start here -} 
main :: IO [()] 
main = do 
    files <- getArgs 
    mapM main' files 

{- Main's helper function -} 
main' :: FilePath -> IO() 
main' file = do 
    contents <- readFile file 
    case (runParser parser 0 file $ lexer contents) of Left err -> print err 
                 Right xs -> putStr xs 

Thanks!

Редактировать: Поскольку большинство из вас предлагает; Я пробовал абстракцию лямбда для этого, но не понял. - Должен был указать это выше. С примерами я вижу это лучше.

ответ

5

Вы можете использовать forM, которая приравнивает flip mapM, т.е. mapM с его аргументами переворачивается, как это:

forM_ files $ \file -> do 
    contents <- readFile file 
    ... 

Также обратите внимание, что я использовал forM_ вместо forM. Это более эффективно, если вас не интересует результат вычисления.

+1

'forM_' и' mapM_' также хороши, потому что они делают ваши намерения более ясными, поэтому вы должны всегда использовать их, даже если производительность не имеет значения. –

+0

Ах да, я пытался что-то похожее на это, но я довольно новичок в «флип» и не думал об использовании здесь. – Dacto

6

Библиотека Control.Monad определяет функцию forM, которая является mapM, является обратным аргументом. Это делает его легче использовать в вашей ситуации, то есть

main :: IO() 
main = do 
    files <- getArgs 
    forM_ files $ \file -> do 
     contents <- readFile file 
     case (runParser f 0 file $ lexer contents) of 
      Left err -> print err 
      Right xs -> putStr xs 

версия с подчеркиванием в конце имени используется, когда вы не заинтересованы в результирующем списке (как в данном случае), так main может просто введите тип IO(). (mapM имеет аналогичный вариант под названием mapM_).

+0

Теперь я использую mapM_/forM_. :) – Dacto

Смежные вопросы