HaskellでPerlの<>

30分プログラム、その379。HaskellPerlの<>(ダイヤモンド演算子)っぽいやつを実現してみる。
Perlの<>は、実にうまくできた演算子

になる。
これを使うと、catコマンドが、

while(<>){ print; }

で書けるてしまう。これを思いついた人は、天才だと思う。

ちなみにRubyistの人はARGFまたは$<を使うといいと思います。

使い方

-- catコマンド
*Main> let cat = argf putStrLn

-- headコマンド。Prelude.headと名前が被るので、変えている
*Main> let myhead = argf (mapM_ putStrLn . (take 10) . lines)

ソースコード

import System
import System.IO

argf :: (String -> IO ()) -> IO ()
argf f = do args <- getArgs
            case args of
              [] ->
                  getContents >>= f
              _ ->
                  mapM readFile args >>= f . concat