代码之家  ›  专栏  ›  技术社区  ›  Rafael S. Calsaverini

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

  •  10
  • Rafael S. Calsaverini  · 技术社区  · 16 年前

    我需要一些 Int s用作随机数生成的种子,因此我想使用旧技巧,将系统时间用作种子。

    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 但我找不到它的反面。

    4 回复  |  直到 11 年前
        1
  •  17
  •   Norman Ramsey    16 年前

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

    单子 功能 这需要 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)
       }
    

    要了解更多信息,请查阅有关单子的众多优秀教程之一。

        2
  •  9
  •   Thomas    16 年前

    a) 当然,有可能获得 DiffTime 价值否则,此函数将毫无意义。你需要仔细阅读单子。 This chapter 和 the next 哈斯克尔对现实世界有一个很好的介绍。

    b) docs for DiffTime 说它是 Real

    diffTimeToSeconds :: DiffTime -> Integer
    diffTimeToSeconds = floor . toRational
    
        3
  •  9
  •   Reid Barton    16 年前

    如果您计划使用该标准 System.Random getStdGen :: IO StdGen

        4
  •  1
  •   Juan Carlos Kuri Pinto    12 年前

    λ: 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
    
    推荐文章