1

我目前有这段代码,它将main'对列表中的每个文件名执行该功能files

理想情况下,我一直在尝试合并mainmain'但没有取得太大进展。有没有更好的方法来简化这一点,还是我需要将它们分开?

{- 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

谢谢!

编辑:正如你们大多数人所建议的那样;我为此尝试了一个 lambda 抽象,但没有做对。- 应该在上面指定。通过这些示例,我可以更好地理解这一点。

4

2 回答 2

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可以简单地使用 type IO ()。(mapM有一个类似的变体称为mapM_)。

于 2013-02-19T07:14:49.927 回答
5

您可以使用forM, 等于flip mapM,即mapM翻转其参数,如下所示:

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

另请注意,我使用forM_而不是forM. 当您对计算结果不感兴趣时​​,这会更有效。

于 2013-02-19T07:13:09.393 回答