2015-06-27 19 views
3

我想生成定期分隔日期的順序,例如,從現在開始,我要生產名單:如何在Haskell中表示時間間隔?

[now, now + 10 minutes, now + 20 minutes, now + 30 minutes, ...] 

我的功能將在iterate基礎上,並且有兩個參數,startinterval,但應該是那些參數的類型?我一直徘徊在圖書館和維基中,沒有成功。看起來推薦的編碼時間的方法是使用Data.Time.Clock中的UTCTime,推薦的編碼時間差的方法是NominalDiffTime,但是如何生成一天的標稱時間差?例如?

看來,time-lens包提供的方法可以做到這一點,但據我所知鏡頭來提高表現力的一種方式,我會感到驚訝,如果使用的鏡頭是解決這一問題

+3

這對我來說是混亂了。請注意'NominalDiffTime'是'Num'的一個實例,這意味着它支持數字文字。例如。 '1 :: NominalDiffTime'。不知道這是什麼意思,但它可能足以讓你開始。 – luqui

+0

謝謝。正確的,如果我錯了:這是不可見的文檔[由Haddock生成](http://hackage.haskell.org/package/time-1.2.0.3/docs/Data-Time-Clock.html#t:NominalDiffTime ),所以你應該看看源代碼,對吧? – danza

+3

@danza在類型的文檔中,它列出了它是一個實例的類,包括'Num',所以這些信息確實在生成的haddocks中。 (人工編寫的)文檔還說,「轉換功能將其視爲秒」。 –

回答

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(如這裏使用的)將忽略閏秒;即增加60*60*24將產生具有不同日期的同一時間,即使在這兩個UTC時間之間實際上有60*60*24+1秒。這通常(但不總是)你想要的。如果您想要了解閏秒,則可以使用AbsoluteTimeDiffTime而不是UTCTimeNominalDiffTime


,當然你的功能可能僅僅是:

import Data.Time.Clock 

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