我需要一些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
,但我找不到它的逆函数。 最佳答案
是的。关于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的许多高级辅导之一。