如何在Haskell中表示时间间隔?

3
我正在尝试生成一系列日期,这些日期在固定的时间间隔内分隔开来。例如,从现在开始,我想生成以下列表:
[now, now + 10 minutes, now + 20 minutes, now + 30 minutes, ...]

我的函数将基于iterate,有两个参数startinterval,但这些参数的类型应该是什么?我在库和维基上徘徊了很久,但没有成功。看来编码时间的推荐方式是使用Data.Time.Clock中的UTCTime,而编码时间差的推荐方式是NominalDiffTime,但是如何生成一天的名义时间差呢?例如?
看来time-lens包提供了解决此问题的方法,但据我所知,镜头是提高表现力的一种方式,如果使用镜头是解决此问题的唯一方法,我会感到惊讶。

3
我也感到困惑。请注意NominalDiffTimeNum的实例,这意味着它支持数字字面量,例如 1 :: NominalDiffTime。虽然我不确定它具体意味着什么,但这应该足以让你开始了。 - luqui
3
在该类型的文档中,列出了它所属的类,包括 Num,因此该信息确实在生成的 haddocks 中。人工撰写的文档还指出:“转换函数将把它视为秒”。 - Daniel Wagner
谢谢!现在我更好地理解了如何阅读“实例”部分! - danza
现在我明白了我对_instances_的困惑源头。在类型类中,它们将列出实现类型,而在具体类型下,它们将列出已实现的类型类。 - danza
1
@danza 我一时也不确定(保留这个名称以便搜索可能是可以的;可能其他人会使用相同的术语)。实际上,“时间间隔”似乎是常用的用法,只需浏览维基百科即可,所以我撤回我的评论哈哈。如果有一个好的术语来谈论这种事情,那将非常好。 - jberryman
显示剩余5条评论
1个回答

10

在 ghci 中:

Data.Time> now <- getCurrentTime
Data.Time> let tenMinutes = 10*60
Data.Time> mapM_ print . take 10 . iterate (addUTCTime tenMinutes) $ now 
2015-06-27 20:14:21.445443 UTC
2015-06-27 20:24:21.445443 UTC
2015-06-27 20:34:21.445443 UTC
2015-06-27 20:44:21.445443 UTC
2015-06-27 20:54:21.445443 UTC
2015-06-27 21:04:21.445443 UTC
2015-06-27 21:14:21.445443 UTC
2015-06-27 21:24:21.445443 UTC
2015-06-27 21:34:21.445443 UTC
2015-06-27 21:44:21.445443 UTC
请注意,这里使用的NominalDiffTime忽略闰秒;也就是说,即使在这两个UTC时间之间实际上有60*60*24+1秒,添加60*60*24仍将产生相同时间但不同日期的结果。这通常是您想要的(但并非总是如此)。如果您想要考虑闰秒,可以使用AbsoluteTimeDiffTime而不是UTCTimeNominalDiffTime
当然,您的函数也可以是:
import Data.Time.Clock

timeSeq :: UTCTime -> NominalDiffTime -> [UTCTime]
timeSeq start interval = iterate (addUTCTime delta) start

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接