【问题标题】:How to get system time in Haskell using Data.Time.Clock?如何使用 Data.Time.Clock 在 Haskell 中获取系统时间?
【发布时间】:2011-01-07 19:12:25
【问题描述】:

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

所以我尝试使用 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,但我找不到它的逆函数。

【问题讨论】:

    标签: haskell systemtime


    【解决方案1】:

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

    是的。有很多关于 monads 的教程解释了如何操作。它们都基于您编写一个函数 接受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 的众多优秀教程之一。

    【讨论】:

    • 为了简单起见,特别是对于初学者,您可以省略括号作为 return 。 f 以及空白样式的 do-syntax 是什么?
    • @codebliss:对于初学者,我想让事情变得非常明确,因此不需要读者了解运算符优先级或布局的细节
    • 你也可以使用f &lt;$&gt; time,因为每个单子都是函子。 IMO 这看起来很不错。
    • iiuc,这不是展开;它把它包裹在一个单子中并在单子内做事。并不是每个人都觉得单子学是微不足道的。
    【解决方案2】:

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

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

    diffTimeToSeconds :: DiffTime -> Integer
    diffTimeToSeconds = floor . toRational
    

    【讨论】:

    • 但是,这样会丢失皮秒。我通常做truncate . (fromIntegral precision * ) . toRational . utctDayTime,它给你皮秒数。 (并且对于播种 RNG,使用此值可以让您每秒拥有多个初始状态,这在许多应用程序中都很重要。)
    • (哦,精度 = 10000000000000)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这个函数并不是 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多