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