エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

番号を振る

numbering :: [String] -> [String]
numbering ss = map format $ zip [1..] ss
  where
    format (n,s) = setw 6 (show n) ++ ": " ++ s
    setw n s = replicate (n - length s) ' ' ++ s

amazon:ふつうのHaskellプログラミングにもこの例はあるんですが、興味を引かれたのはその先でして。
標準入力を標準出力に出力する次のようなコードに、

main = getContents >>= putStr

次のようにするだけで、各行に番号が振れる。

main = getContents >>= putStr.unlines.numbering.lines

あるいは

main = getContents >>= return.unlines.numbering.lines >>= putStr

わかっていれば当たり前なんですが、宣言的にプログラムが組み上がっていくのが、面白い。