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

dan*_*nza 3 time haskell

我正在尝试生成以固定间隔分隔的日期序列,例如,从现在开始,我想生成列表:

[now, now + 10 minutes, now + 20 minutes, now + 30 minutes, ...]
Run Code Online (Sandbox Code Playgroud)

我的功能将基于iterate并有两个参数,start以及interval但是这应该是类型的那些参数呢?我一直在图书馆和维基中游荡,没有成功.似乎编码时间的推荐方法是使用UTCTimefrom Data.Time.Clock,并且推荐的编码时间差的方法是NominalDiffTime,但是如何生成一天的标称时间差?例如?

似乎time-lens包装提供了这样做的方法,但据我所知,镜片是一种提高表现力的方法,如果使用镜片是解决这个问题的唯一方法,我会感到惊讶

Dan*_*ner 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
Run Code Online (Sandbox Code Playgroud)

注意NominalDiffTime(在这里使用)忽略闰秒; 也就是说60*60*24,即使60*60*24+1在这两个UTC时间之间实际有几秒钟,添加也会产生不同日期的相同时间.这通常(但不总是)你想要的.如果你想知道闰秒,你可以使用AbsoluteTimeDiffTime不是UTCTimeNominalDiffTime.


当然你的功能可能是:

import Data.Time.Clock

timeSeq :: UTCTime -> NominalDiffTime -> [UTCTime]
timeSeq start interval = iterate (addUTCTime delta) start
Run Code Online (Sandbox Code Playgroud)