Как я могу заставить GHC выдавать предупреждение для данной функции? - PullRequest
0 голосов
/ 18 января 2019

Предположим, я решил, что везде в данной кодовой базе (пакете) я хочу использовать пользовательский getCurrentTimeMicroseconds вместо getCurrentTime. Есть ли у меня способ заставить GHC выдавать предупреждения об использовании getCurrentTime только в этой кодовой базе? (Не для чего-либо вверх или вниз по течению.)

Бонусный вопрос, предположим, я хочу выборочно разрешить использование с явной аннотацией на сайте использования (желательно не для всего модуля). Это тоже возможно?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Это то, что типы для. Тип, который вы используете для времен, должен отражать ограничения, которые вы хотите наложить на значения, которые он представляет.

Например, вы можете обернуть UTCTime примерно так:

newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }

microsecondsFromPicos :: UTCTime -> UTCTimeMicroseconds
microsecondsFromPicos = ...

getCurrentTimeMilliseconds :: IO UTCTimeMicroseconds
getCurrentTimeMilliseconds = microsecondsFromPicos <$> getCurrentTime

И используйте новый тип повсюду в вашем пакете, чтобы у вас было время, чтобы иметь это свойство.

Если вы хотите быть строгими в этом, не экспортируйте конструктор UTCTimeMicroseconds, поэтому единственный способ получить одно из этих значений - использовать microsecondsFromPicos, что обеспечивает выполнение вашего требования.

Это делает любое неправильное использование ошибкой, а не предупреждением, но в большинстве случаев это именно то, что вам нужно.

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

0 голосов
/ 18 января 2019

Я не могу придумать способ сделать это прямо сейчас, но я думаю, что самое близкое, что вы можете получить, это что-то вроде:

  • создать новый пакет my-time, который зависит от time
  • реэкспорт ваших функций шимма с предупреждениями, такими как

    import qualified Data.Time as Time
    {-# WARNING getCurrentTime "you should prefer getCurrentTimeMicroseconds" #-}
    getCurrentTime = Time.getCurrentTime
    
  • зависит от my-time в ваших пакетах

очевидно, что это не дает вам способа принудительно не импортировать Data.Time.getCurrentTime, и еще менее удовлетворительно, когда код, который вы хотите подобрать, находится в Prelude или base.

...