我在Haskell程序中有这样的代码:
...
start <- getCurrentTime
...
end <- getCurrentTime
...
delta = end `diffUTCTime` start
...
在此之后,delta
的类型为NominalDiffTime
。正如在文档中所写,这种类型继承自Num
,我希望在小数点后用3(例如)位置打印它。但是,使用printf "%.3f" delta
之类的内容无效:No instance for (PrintfArg NominalDiffTime)
。
如何正确地做到这一点?
答案 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)
做到了。