人気ブログランキング | 話題のタグを見る

Haskell 版 reverse

Haskell でファイルの行を逆順にするフィルター reverse を書いてみた。

-- filename: reverse.hs

import System.Environment (getArgs)

concatFile :: [FilePath] -> IO [Char]
concatFile [] = return []
concatFile (f:fs) = do
  xs <- readFile f
  rest <- concatFile fs
  return $ xs ++ rest

main = do
  args <- getArgs
  if null args
    then do
      cs <- getContents
      putStr $ (unlines . reverse . lines) cs
    else do
      cs <- concatFile args
      putStr $ (unlines . reverse . lines) cs

上のプログラムの reverse の部分を他の関数にすれば、たいていのフィルターに利用できると思う。次の実行例のように、ファイルを連結して逆順にすることもできる。

実行例:
>reverse cat.hs reverse.hs
(結果省略)
by tnomura9 | 2011-11-21 02:29 | Haskell | Comments(2)
Commented by ツムジ at 2011-11-23 14:32 x
main 関数は次のようにした方が、すっきりすると思いますが、どうでしょう?

main = do
args <- getArgs
cs <- if null args
then getContents
else concatFile args
putStr $ (unlines . reverse . lines) cs
Commented by tnomura9 at 2011-11-23 15:49
ツムジさん、コメントありがとうございました。

putStr $ (unlines . reverse . lines) cs の重複がなくなったうえに、余分な do 記法もありませんね。参考になりました。
<< コスプレ Haskell 版 cat >>