Это то, что типы для. Тип, который вы используете для времен, должен отражать ограничения, которые вы хотите наложить на значения, которые он представляет.
Например, вы можете обернуть UTCTime
примерно так:
newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }
microsecondsFromPicos :: UTCTime -> UTCTimeMicroseconds
microsecondsFromPicos = ...
getCurrentTimeMilliseconds :: IO UTCTimeMicroseconds
getCurrentTimeMilliseconds = microsecondsFromPicos <$> getCurrentTime
И используйте новый тип повсюду в вашем пакете, чтобы у вас было время, чтобы иметь это свойство.
Если вы хотите быть строгими в этом, не экспортируйте конструктор UTCTimeMicroseconds
, поэтому единственный способ получить одно из этих значений - использовать microsecondsFromPicos
, что обеспечивает выполнение вашего требования.
Это делает любое неправильное использование ошибкой, а не предупреждением, но в большинстве случаев это именно то, что вам нужно.
Если вы хотите использовать UTCTime
с полным разрешением, или вам все равно, вы можете просто использовать этот тип как обычно. Будет легко найти места в вашей кодовой базе, где это произойдет, потому что они будут только местами, где используется UTCTime
.