Я могу ошибаться, но похоже, что это заслуживает более длинного ответа, чем тот, что в комментариях ...
Тип NominalDiffTime
имеет экземпляры для различных числовых классов типов (Num
, Fractional
и т. д.), которые позволяют обрабатывать его как простой числовой тип за считанные секунды. Это позволяет вам писать такие вещи как:
halfSecondLater :: NominalDiffTime -> NominalDiffTime
halfSecondLater x = x + 0.5
Аналогично, Micro
- это просто псевдоним типа для Fixed E6
, который является числовым типом с фиксированной точностью и соответствующим набором числовых классов типов.
Таким образом, преобразование типа NominalDiffTime
(который является числовым типом в секундах) в Micro
(который является числовым типом в некоторой неопределенной единице, которая может быть секундами) мало чем отличается от преобразования Double
вa Float
.
Общая функция преобразования между действительными, но нецелыми числовыми типами - это функция realToFrac
, которую никто никогда не сможет запомнить или найти, потому что она названа для классов типов, которые она преобразует между(поскольку Real
реализует toRational
, а Fractional
реализует fromRational
) вместо того, для чего он фактически используется.
Итак, вы можете использовать realToFrac
напрямую или написать специализацию:
nominalToMicro :: NominalDiffTime -> Micro
nominalToMicro = realToFrac