3

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

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

在此之后,delta有类型NominalDiffTime。正如文档中所写,这种类型继承自Num,我想用小数点后的 3 个(例如)位打印它。但是,使用类似的东西printf "%.3f" delta不起作用:No instance for (PrintfArg NominalDiffTime).

如何正确执行此操作?

4

2 回答 2

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值。

于 2012-09-07T13:38:26.387 回答
5

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

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

可以。

于 2012-09-07T13:28:23.713 回答