我需要一些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的许多高级辅导之一。

10-08 16:43