久々にHaskellの練習

Haskellで外部実行ファイルの実行時間を調べる。つづき - 妄想宝箱

やっぱりshowTimeが長い。

http://d.hatena.ne.jp/coppieee/20090426/1240748315

ということで,久々にHaskell書いた.

module Main where
import System
import System.Process
import Time
main = do
    args <- getArgs
    start <- getClockTime
    wait $ unwords args
    end <- getClockTime
    putStrLn $ showTime $ diffClockTimes end start
	
wait :: String -> IO ExitCode
wait = (>>= waitForProcess) . runCommand
{-
showTime :: TimeDiff -> String
showTime (TimeDiff year month d h m s p) = showNonZero year "year " ++
    showNonZero month "month " ++  showNonZero d "d " ++
    showNonZero h "h " ++ show m ++ "m "++ show s ++ "s " ++
    (show $ div p 1000000000) ++ "ms"
-}

showTime :: TimeDiff -> String
showTime (TimeDiff year month d h m s p)
    = concat
      $ map (uncurry showNonZero)
            [(year, "year "), (month, "month ") ,(d, "d ") ,(h, "h ")]
            ++ map (\(x, y) -> show x ++ y)
                   [(m, "m "), (s, "s "), (fromInteger $ div p 1000000000, "ms")]

showNonZero :: (Num a) => a -> String -> String
showNonZero 0 _ = ""
showNonZero x unit = show x ++ unit

showTime以外はid:coppieeeからそのまま.
mapでどうしていいか解らなかったので,uncurryを使うはめになったけど,showNonZeroを書き換えればいいことに気付いた.まぁ,今回はshowTimeだけ書き換えるということでこんな感じで.
あんまり短くはなってない気がする.
行が長いとき,どこで改行すればいいのかよくわからない.