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

ありがとう!

編集:あなたのほとんどが示唆しているように。私はこれのためにラムダ抽象化を試みていましたが、うまくいきませんでした。- これを上記で指定する必要がありました。例を見ると、これがよくわかります。

4

2 に答える 2

6

Control.Monadライブラリは、逆引数である関数を定義しますforMmapMこれにより、状況での使用が容易になります。

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 に答える