Мне нужны некоторые Int
s для использования в качестве семени к генерации случайных чисел и таким образом, я хотел использовать старый прием использования системного времени как семя.
Таким образом, я пытался использовать Данные. Пакету времени и мне удалось сделать следующее:
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
но я не мог найти его инверсию.
Можно ли каким-то образом развернуть 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)
}
Для более подробной информации проконсультируйтесь с одним из многих прекрасных репетиторов по монадам.
a) Конечно, можно получить значение DiffTime
, иначе эта функция была бы весьма бессмысленной. Вам нужно будет прочитать о монадах. Эта глава и следующая Хаскелла из Реального мира имеет хорошее введение.
b) В документах для DiffTime
говорится, что это экземпляр класса Real
, т.е. его можно рассматривать как вещественное число, в данном случае - как количество секунд. Преобразование его в секунды, таким образом, является простым вопросом цепочки функций преобразования:
diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
Если вы планируете использовать стандарт модуль System.random
для генерации случайного числа, то уже есть генератор с зависимым от времени, инициализированной для вас: вы Может получить его, позвонив GetStdgen :: IO STDGen
. (Конечно, вам все еще нужен ответ на часть (а) вашего вопроса, чтобы использовать результат.)