Haskell その2

うーむ、道のりは遠いなぁ。
じっくり行くとしましょうか。

周りが明るければ、遠くを見渡して近道を考えるけども、
こういう暗闇の中にいるときは足元だけ気にしとこう。

とりあえず、再度、他の人のcatを見てみる。

import System
main = do args <- getArgs
          case args of
            [] -> putStr =<< getContents
            _  -> mapM_ (\a -> putStr =<< readFile a) args

まず分からないのは、

  • caseって、caseだろうなぁ…、でも"_"ってなんだろ。後にとっておこう。
  • getContents?なぜに標準入力が…。ああ、本当(?)のcatを真似したいのか。でも今はその機能いらない。

なので、引数のファイルだけを処理させるようにすれば、

import System
cat fns =  mapM_ (\a -> readFile a >>= putStr) fns
main = getArgs >>= cat

さらに短くできる。

import System
main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)

でも、あのワンライナーとちょっと違う。
lambdaに名前を与えて、もう一回分解。

import System
cat fn = readFile fn >>= putStr
cats fns = mapM cat fns
main = getArgs >>= cats

なるほど、やっと↓にたどり着いた気分。

import System
main = getArgs >>= mapM readFile >>= mapM_ putStr

あ、もう用無しになったけど"_"は理解しとこう
http://www.sampou.org/haskell/tutorial-j/patterns.html
パターンマッチングのワイルドカード表現なのね。
さらに、"とくに値を気にしない照合"であり"ひとつの等式のなかに 1 つ以上あってもかまいません。"とな。

head (x:_)             = x
tail (_:xs)            = xs

へぇ。