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

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)

类型timeIO 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之一.

  • @codebliss:对于初学者我想让事情变得非常明确,因此不需要读者理解运算符优先级或布局的细节 (5认同)
  • 你也可以做`f <$> time`,因为每个monad都是一个仿函数.IMO看起来非常好. (2认同)

Tho*_*mas 8

a)当然可以获得DiffTime价值; 否则,这个功能将毫无意义.你需要阅读monad.本章下一个 Real World Haskell有一个很好的介绍.

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

diffTimeToSeconds :: DiffTime -> Integer
diffTimeToSeconds = floor . toRational
Run Code Online (Sandbox Code Playgroud)


Rei*_*ton 8

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