Как получить системное время в Haskell, использующем Данные. Время. Часы?

Мне нужны некоторые Ints для использования в качестве семени к генерации случайных чисел и таким образом, я хотел использовать старый прием использования системного времени как семя.

Таким образом, я пытался использовать Данные. Пакету времени и мне удалось сделать следующее:

import Data.Time.Clock

time = getCurrentTime >>= return . utctDayTime

Когда я выполняю время, я получаю вещи как:

Prelude Data.Time.Clock> time
55712.00536s

Тип time IO DiffTime. Я ожидал видеть IO Something введите, поскольку это зависит от вещей, внешних к программе. Таким образом, у меня есть два вопроса:

a) Действительно ли возможно так или иначе развернуть IO и получить базовое значение DiffTime?

b) Как я преобразовываю DiffTime в целое число с, он - значение в секундах? Существует функция secondsToDiffTime но я не мог найти его инверсию.

11
задан Erik Kaplun 2 September 2015 в 10:37
поделиться

3 ответа

Можно ли каким-то образом развернуть IO и получить базовое значение DiffTime?

Да. Есть десятки учебников по monads , которые объясняют, как это сделать. Все они основаны на идее, что вы пишете функцию , которая берет DiffTime и делает что-то (скажем, возвращает IO ()) или просто возвращает Answer. Итак, если у вас есть f :..: DiffTime -> Answer, вы пишете

time >>= \t -> return (f t)

, который некоторые люди предпочли бы написать

time >>= (return . f) 

, и если у вас есть продолжение :: DiffTime -> IO () у вас есть

time >>= continue

или вы можете предпочесть do примечание:

do { t <- time
   ; continue t  -- or possibly return (f t)
   }

Для более подробной информации проконсультируйтесь с одним из многих прекрасных репетиторов по монадам.

17
ответ дан 3 December 2019 в 02:19
поделиться

a) Конечно, можно получить значение DiffTime, иначе эта функция была бы весьма бессмысленной. Вам нужно будет прочитать о монадах. Эта глава и следующая Хаскелла из Реального мира имеет хорошее введение.

b) В документах для DiffTime говорится, что это экземпляр класса Real, т.е. его можно рассматривать как вещественное число, в данном случае - как количество секунд. Преобразование его в секунды, таким образом, является простым вопросом цепочки функций преобразования:

diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
8
ответ дан 3 December 2019 в 02:19
поделиться

Если вы планируете использовать стандарт модуль System.random для генерации случайного числа, то уже есть генератор с зависимым от времени, инициализированной для вас: вы Может получить его, позвонив GetStdgen :: IO STDGen . (Конечно, вам все еще нужен ответ на часть (а) вашего вопроса, чтобы использовать результат.)

8
ответ дан 3 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: