12

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

twoSeconds = secondsToDiffTime 2

现在我想与 UTCTime 交互:

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

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

4

2 回答 2

18

NominalDiffTime并且DiffTime都有RealFrac实例,因此都有FractionalReal实例。

您可以通过以下方式将其中一个转换为另一个

fromRational . toRational

其中有类型(Real a, Fractional c) => a -> c。这是很常见的事情,并且在标准前奏中提供。

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

DiffTime并且NominalDiffTime都有NumFractional实例。这意味着您可以使用整数和浮点文字来代替它们中的任何一个。以下所有工作无需任何额外的仪式。

addUTCTime (-2)
addUTCTime 600
addUTCTime 0.5
于 2014-09-12T13:29:38.847 回答
13

由于NominalDiffTime是 的一个实例Num,您可以使用fromInteger.

>>> fromInteger 1 :: NominalDiffTime
1s
于 2014-09-12T10:49:44.773 回答