Исправлено преобразование чисел с различной точностью - PullRequest
2 голосов
/ 01 ноября 2019

Я новичок в Haskell и не могу понять, как преобразовать NominalDiffTimeSource (из пакета time , который имеет точность 10^-12) в Micro (из пакета base , точность которого 10^-6).

1 Ответ

2 голосов
/ 01 ноября 2019

Я могу ошибаться, но похоже, что это заслуживает более длинного ответа, чем тот, что в комментариях ...

Тип 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
...