2011-12-01 (Thu) [長年日記]
_ readFile/interact
コメントを参考に研究した結果、
readLines :: FilePath -> IO [String] readLines path = do h <- openFile path ReadMode cs <- hGetContents h return $ lines cs main = do paths <- getArgs liness <- sequence (map readLines paths)
は、readLinesのような定義をせずに
main = do paths <- getArgs lines <- concatMap lines `fmap` mapM readFile paths
と書けることがわかった。
readFileはRubyのFile.readのようなもので、pathを与えるとファイルのすべての 内容を文字列で返す(正確にはそういうアクションを返す。lazyなので読みこみは逐次必要になった時に起こる。)。
concatMapMみたいなのはないかなと思ったがrejectされていた。
また、interactという関数にString -> Stringという型の関数を与えると、標準入力を加工して標準出力に出力するような処理が簡単に書けるらしい。UNIXぽい。