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).
怎么做到这一点?
如果你想要一个格式很好的差异时间,你可以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值.
您可以将其转换为PrintfArg类型,以所需的格式打印,例如
printf "%.3f" (realToFrac delta :: Double)
Run Code Online (Sandbox Code Playgroud)
可以.