簡體   English   中英

如何使用Data.Time.Clock在Haskell中獲取系統時間?

[英]How to get system time in Haskell using Data.Time.Clock?

我需要一些Int用作隨機數生成的種子,所以我想使用系統時間作為種子的舊技巧。

所以我嘗試使用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但我找不到它的逆。

有可能以某種方式展開IO並獲取基礎DiffTime值嗎?

是。 monad上有很多關於如何解釋的教程。 它們都基於這樣的想法:你編寫了一個接受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上許多精細的tutorals之一。

a)當然可以獲得DiffTime值; 否則,這個功能將毫無意義。 你需要閱讀monad。 本章下一個 Real World Haskell有一個很好的介紹。

b) DiffTime文檔說它是Real類的一個實例,即它可以被視為實數,在這種情況下是秒數。 因此,將其轉換為秒是鏈接轉換函數的簡單問題:

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

如果您計划使用標准的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM