2015-06-27 2 views
3

Я пытаюсь создать последовательность дат, разделенных через регулярные промежутки времени, например, начиная с этого момента, я хочу, чтобы произвести список:Как выразить интервалы времени в Haskell?

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

Моя функция будет основываться на iterate и имеют два аргумента, start и interval, но какие типы этих аргументов должны быть? Я блуждал по библиотеке и вики, но безуспешно. Кажется, что рекомендуемый способ кодирования времени - использовать UTCTime от Data.Time.Clock, а рекомендуемый способ кодирования разницы во времени - 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', поэтому эта информация действительно находится в сгенерированных пикшах. В письменной документации также написано: «Функции преобразования будут обрабатывать ее как секунды». –

ответ

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 приведет к тому же времени с другой датой, даже если на самом деле 60*60*24+1 секунд между этими двумя UTC раз. Это часто (но не всегда) то, что вы хотите. Если вы хотите быть уверенным в прыжке, вы можете использовать AbsoluteTime и DiffTime вместо UTCTime и NominalDiffTime.


и, конечно, ваша функция может быть просто:

import Data.Time.Clock 

timeSeq :: UTCTime -> NominalDiffTime -> [UTCTime] 
timeSeq start interval = iterate (addUTCTime delta) start 
Смежные вопросы