Raf*_*ini 11 haskell systemtime
我需要一些Ints作为随机数生成的种子,所以我想使用系统时间作为种子的旧技巧.
所以我尝试使用Data.Time包,我设法做了以下事情:
import Data.Time.Clock
time = getCurrentTime >>= return . utctDayTime
Run Code Online (Sandbox Code Playgroud)
当我运行时,我会得到以下内容:
Prelude Data.Time.Clock> time
55712.00536s
Run Code Online (Sandbox Code Playgroud)
类型time是IO DiffTime.我希望看到一个IO Something类型,因为这取决于程序外部的东西.所以我有两个问题:
a)是否有可能以某种方式解包IO并获取基础DiffTime值?
b)如何将DiffTime转换为整数值,以秒为单位?有一个功能,secondsToDiffTime但我找不到它的逆.
Nor*_*sey 17
有可能以某种方式展开IO并获取基础DiffTime值吗?
是.monad上有很多关于如何解释的教程.它们都是基于这样的想法:你编写了一个函数,它接受DiffTime并执行某些操作(比如返回IO ())或只返回一个函数Answer.所以,如果你有f :: DiffTime -> Answer,你写
time >>= \t -> return (f t)
Run Code Online (Sandbox Code Playgroud)
有些人更愿意写
time >>= (return . f)
Run Code Online (Sandbox Code Playgroud)
如果你有的continue :: DiffTime -> IO ()话
time >>= continue
Run Code Online (Sandbox Code Playgroud)
或者您可能更喜欢do表示法:
do { t <- time
; continue t -- or possibly return (f t)
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请咨询monad上许多精细的tutorals之一.
a)当然可以获得DiffTime价值; 否则,这个功能将毫无意义.你需要阅读monad.本章和下一个 Real World Haskell有一个很好的介绍.
b)文档DiffTime说它是Real类的一个实例,即它可以被视为实数,在这种情况下是秒数.因此,将其转换为秒是链接转换函数的简单问题:
diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
Run Code Online (Sandbox Code Playgroud)
如果您计划使用标准System.Random模块生成随机数,那么已经有一个生成器,其中为您初始化了一个与时间相关的种子:您可以通过调用来获取它getStdGen :: IO StdGen.(当然,您仍然需要问题(a)部分的答案才能使用结果.)