Journal InTime


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ぽい。

Tags: Haskell