在Haskell中打印NominalDiffTime

apl*_*vin 3 haskell type-conversion

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

...
start <- getCurrentTime
...
end <- getCurrentTime
...
delta = end `diffUTCTime` start
...
Run Code Online (Sandbox Code Playgroud)

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

怎么做到这一点?

Ale*_*rov 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"
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*her 5

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

printf "%.3f" (realToFrac delta :: Double)
Run Code Online (Sandbox Code Playgroud)

可以.