main = do cs <- getContents putStr $ numbering cs where numbering :: String -> String numbering cs = unlines $ map (format $ nwidth $ length $ lines cs) (zipLineNumber $ lines cs) zipLineNumber :: [String] -> [(Int, String)] zipLineNumber xs = zip [1..] xs nwidth :: Int -> Int nwidth len = ceiling $ logBase 10 $ fromIntegral $ len + 1 format :: Int -> (Int, String) -> String format width (n, line) = rjust width (show n) ++ " " ++ line rjust :: Int -> String -> String rjust width s = replicate (width - length s) ' ' ++ s
ポイントフリースタイルにして、さらにdoを(>>=)で書き換えた版です。numberingのシグネチャも変えました。
main = getContents >>= putStr . unlines . numbering . lines where numbering :: [String] -> [String] numbering ls = map (format $ nwidth $ length ls) (zipLineNumber ls) zipLineNumber :: [String] -> [(Int, String)] zipLineNumber = zip [1..] nwidth :: Int -> Int nwidth = ceiling . logBase 10 . fromIntegral . (1 +) format :: Int -> (Int, String) -> String format width (n, line) = rjust width (show n) ++ " " ++ line rjust :: Int -> String -> String rjust width s = replicate (width - length s) ' ' ++ s