在Haskell中打印NominalDiffTime

时间:2012-09-07 13:23:02

标签: haskell type-conversion

我在Haskell程序中有这样的代码:

...
start <- getCurrentTime
...
end <- getCurrentTime
...
delta = end `diffUTCTime` start
...

在此之后,delta的类型为NominalDiffTime。正如在文档中所写,这种类型继承自Num,我希望在小数点后用3(例如)位置打印它。但是,使用printf "%.3f" delta之类的内容无效:No instance for (PrintfArg NominalDiffTime)

如何正确地做到这一点?

2 个答案:

答案 0 :(得分:6)

如果您想要格式化的差异时间,可以将System.Time.Utils (renderSecs)round一起使用

 ghci> import Data.Time.Clock
 ghci> import System.Time.Utils (renderSecs)
 ghci> 
 ghci> let renderS = renderSecs . round :: NominalDiffTime -> String
 ghci> t1 <- getCurrentTime
 ghci> -- wait a little :-P
 ghci> t2 <- getCurrentTime
 ghci> renderS $ t2 `diffUTCTime` t1
 "2m15s"

它也会以d为单位,以h为单位。请注意,类型签名对于ghci是必需的,否则它将默认为Double,并且突然您无法提供NominalDiffTime值。

答案 1 :(得分:5)

您可以将其转换为PrintfArg类型,以所需格式打印,例如

printf "%.3f" (realToFrac delta :: Double)

做到了。