如何将DiffTime转换为NominalDiffTime?

时间:2014-09-12 10:38:46

标签: haskell

使用时间库(时间-1.5),我有一个常数,例如1秒。我没有看到创建NominalDiffTime的方法,所以我创建了一个DiffTime:

twoSeconds = secondsToDiffTime 2

现在我想与UTCTime互动:

now <- getCurrentTime
let twoSecondsAgo = addUTCTime (-twoSeconds) now

当然,不会对类型进行检查,因为addUTCTime期望参数1中的NominalDiffTime并且我已经传递了DiffTime。如何在两种类型之间进行转换?或者我如何创建2秒的NominalDiffTime?

2 个答案:

答案 0 :(得分:15)

NominalDiffTimeDiffTime都有RealFrac个实例,因此包含FractionalReal个实例。

您可以通过

将其中任何一个转换为另一个
fromRational . toRational

哪个类型为(Real a, Fractional c) => a -> c。这是一件非常常见的事情,并在standard prelude中提供。

realToFrac     :: (Real a, Fractional b) => a -> b
realToFrac      =  fromRational . toRational

DiffTimeNominalDiffTime都有NumFractional个实例。这意味着您可以使用integer and floating literals代替其中任何一个。所有以下工作都没有任何额外的仪式。

addUTCTime (-2)
addUTCTime 600
addUTCTime 0.5

答案 1 :(得分:13)

由于NominalDiffTimeNum的实例,您可以使用fromInteger创建它。

>>> fromInteger 1 :: NominalDiffTime
1s