Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Data.time.Clock在Haskell中获取系统时间?_Haskell_Systemtime - Fatal编程技术网

如何使用Data.time.Clock在Haskell中获取系统时间?

如何使用Data.time.Clock在Haskell中获取系统时间?,haskell,systemtime,Haskell,Systemtime,我需要一些Ints作为随机数生成的种子,所以我想使用旧的技巧,使用系统时间作为种子 因此,我尝试使用Data.Time软件包,并设法做到以下几点: import Data.Time.Clock time = getCurrentTime >>= return . utctDayTime 当我运行时,我会得到如下结果: Prelude Data.Time.Clock> time 55712.00536s time的类型是IO DiffTime。我希望看到一个IO Somet

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

因此,我尝试使用Data.Time软件包,并设法做到以下几点:

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
,但我找不到它的逆函数。

a)当然可以得到
DiffTime
值;否则,此函数将毫无意义。你需要仔细阅读单子。关于现实世界,哈斯克尔有一个很好的介绍

b) 假设它是
Real
类的一个实例,即它可以被视为一个实数,在本例中是秒数。因此,将其转换为秒只需链接转换函数:

diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
是否有可能以某种方式打开IO并获取底层DiffTime值

对。有很多关于单子的教程解释了单子的使用方法。它们都基于这样一种想法,即您编写一个函数,它需要
DiffTime
并执行某些操作(比如返回
IO()
),或者只返回
答案。因此,如果您有
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)
   }

do{t如果您计划使用标准的
System.Random
模块生成随机数,那么已经有一个生成器为您初始化了一个时间相关的种子:您可以通过调用
getStdGen::IO StdGen
来获得它(当然,您仍然需要(a)部分的答案))此函数不是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
λ:导入数据.Time.Clock
λ:让getSeconds=getCurrentTime>>=返回.fromRational.toRational.utctDaily
λ::我得到秒数
getSeconds::IO Double--定义时间:56:5
λ:秒
57577.607162
λ:秒
57578.902397
λ:秒
57580.387334

为了简单起见,特别是对于初学者,我认为可以省略括号作为回报。f和who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who who whnad是一个函子。在我看来,这看起来很不错。iiuc,这不是拆开,而是把它包在一个单子里,在单子里面做一些事情。并不是每个人都觉得单子学很琐碎。然而,你这样就失去了皮秒。我通常做
截断。(从整数精度*).torional.utctday
,它提供皮秒数。(对于播种RNG,使用此值可使您每秒具有多个初始状态,这在许多应用程序中都很重要。)(哦,精度=1000000000000)