12

我需要一些Ints 用作随机数生成的种子,所以我想使用使用系统时间作为种子的旧技巧。

所以我尝试使用 Data.Time 包,我设法做到了以下几点:

import Data.Time.Clock

time = getCurrentTime >>= return . utctDayTime

当我运行时间时,我会得到如下信息:

Prelude Data.Time.Clock> time
55712.00536s

的类型timeIO DiffTime。我希望看到一种IO Something类型,因为这取决于程序外部的东西。所以我有两个问题:

a) 是否有可能以某种方式打开 IO 并获得底层 DiffTime 值?

b) 如何将 DiffTime 转换为整数,其值以秒为单位?有一个函数secondsToDiffTime,但我找不到它的逆函数。

4

4 回答 4

17

是否有可能以某种方式打开 IO 并获得底层的 DiffTime 值?

是的。有几十个关于monad的教程解释了如何。它们都基于这样的想法,即您编写一个函数来接受DiffTime并执行某些操作(例如返回IO ())或仅返回一个Answer. 所以如果你有f :: DiffTime -> Answer,你写

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

有些人更愿意写

time >>= (return . f) 

如果你有continue :: DiffTime -> IO ()你有

time >>= continue

或者您可能更喜欢do符号:

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

有关更多信息,请参阅有关 monad 的众多优秀教程之一。

于 2010-01-21T16:04:56.013 回答
9

a) 当然可以得到DiffTime值;否则,此功能将毫无意义。你需要阅读单子。本章和Real World Haskell的下一章都有很好的介绍。

b)文档DiffTime说它是Real类的一个实例,即它可以被视为一个实数,在这种情况下是秒数。因此,将其转换为秒是链接转换函数的简单问题:

diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
于 2010-01-21T15:39:03.567 回答
9

如果您打算使用标准System.Random模块来生成随机数,那么已经有一个为您初始化了与时间相关的种子的生成器:您可以通过调用getStdGen :: IO StdGen. (当然,您仍然需要回答问题的(a)部分才能使用结果。)

于 2010-01-21T16:43:08.307 回答
1

此功能不完全是 OP 所要求的。但它很有用:

λ: import Data.Time.Clock
λ: let getSeconds = getCurrentTime >>= return . fromRational . toRational . utctDayTime
λ: :i getSeconds 
getSeconds :: IO Double     -- Defined at <interactive>:56:5
λ: getSeconds 
57577.607162
λ: getSeconds 
57578.902397
λ: getSeconds 
57580.387334
于 2014-06-16T16:00:34.997 回答