在Haskell中打印NominalDiffTime

在Haskell中打印NominalDiffTime,haskell,type-conversion,Haskell,Type Conversion,我的Haskell程序中有这样一段代码: ... start <- getCurrentTime ... end <- getCurrentTime ... delta = end `diffUTCTime` start ... 。。。 开始您可以将其转换为PrintfArg类型,以所需格式打印,例如 printf "%.3f" (realToFrac delta :: Double) 确实如此。如果您想要格式良好的diff time,可以将System.time.Utils(r

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

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

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

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

确实如此。

如果您想要格式良好的diff time,可以将
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"
ghci>导入数据.Time.Clock
ghci>导入System.Time.Utils(renderSecs)
ghci>
ghci>let renderS=renderSecs。round::NominalDiffTime->String
ghci>t1——稍等:-P
ghci>t2渲染$t2`diffUTCTime`t1
“2m15s”

它也会将天作为d,小时作为h。请注意,类型签名对于ghci是必需的,因为否则它将默认为
Double
,并且突然无法为其提供
NominalDiffTime
值。

如果使用参数定义类型签名,则不需要类型签名,
let renderS d=renderSecs(第d轮)
,或者,如果您关闭MR
:set-XNoMonomorphismRestriction
,它是否只适合打印整秒数,或者也可以修改为小数部分?我试着从同一个
系统.Time.Utils
中使用
renderd
,但是运气不好。@DanielFischer,是的,这也是可能的。谢谢你指出它。@chersaya:不,请看签名:
renderSecs::Integer->String
。我认为您必须编写自己的漂亮打印函数才能做到这一点。您也可以只使用
renderSecs
,然后从
DiffTime
中减去整数,得到小数部分,然后将其附加到渲染函数。丑陋,我知道,但除了重新实现
renderd
之外,我看不到任何方法。请注意,
delta
不一定是两个时间之间经过的时间-
NominalDiffTime
忽略闰秒,例如。这是真的,但我认为几乎所有程序都可以安全地忽略它。好吧,你这么说,但令人沮丧的是,上次有一次令人尴尬的闰秒,有多少东西坏了。。。我的sysadmin服务器必须重新启动两次,iirc。例如,如果你非常不走运,我认为
delta
可能是负数。。。(或是肯定的,或是不应该的)