Haskell 使用mapM f[list],其中f是用do符号定义的

Haskell 使用mapM f[list],其中f是用do符号定义的,haskell,Haskell,我目前有这段代码,它将对列表文件中的每个文件名执行main函数 理想情况下,我一直在尝试将main和main结合起来,但我没有取得多大进展。有没有更好的方法来简化这个问题,或者我需要将它们分开 {- Start here -} main :: IO [()] main = do files <- getArgs mapM main' files {- Main's helper function -} main' :: FilePath -> IO () main'

我目前有这段代码,它将对列表文件中的每个文件名执行main函数

理想情况下,我一直在尝试将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
谢谢

编辑:正如你们大多数人所建议的;我试着用lambda抽象法来做这个,但是做得不对应该在上面指定这个。通过示例,我可以更好地看到这一点。

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

forM_ files $ \file -> do
  contents <- readFile file
  ...
还请注意,我使用了forM_u而不是forM。当您对计算结果不感兴趣时,这会更有效。

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

forM_ files $ \file -> do
  contents <- readFile file
  ...
还请注意,我使用了forM_u而不是forM。当您对计算结果不感兴趣时,这会更有效。

库定义了函数mapM is reverse arguments。这使得它更容易在您的情况下使用,即

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。\p>库定义了一个函数,该函数是mapM is reverse arguments。这使得它更容易在您的情况下使用,即

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_u。

forM_u和mapM_u也很好,因为它们能让你的意图更清晰,所以你通常应该始终使用它们,即使性能不重要。啊,是的,我曾经尝试过类似的东西,但我对flip还比较陌生,没有想到在这里使用。forM_uu和mapM_u也很好,因为它们能让你的意图更清晰,所以你通常应该一直使用它们,即使性能不重要。啊,是的,我曾经尝试过类似的东西,但我对flip还比较陌生,没有想到在这里使用它。我现在使用的是mapM\u/forM\u.:我现在正在使用mapM\uu/forM\uu.: