我怎样才能让 GHC 对给定的函数发出警告?

How can I get GHC to emit a warning for a given function?

假设我决定在给定的代码库(包)中的任何地方我都想使用自定义 getCurrentTimeMicroseconds 而不是 getCurrentTime。有没有办法让 GHC 仅在该代码库中发出有关使用 getCurrentTime 的警告? (不适用于任何上游或下游。)

奖金问题,假设我想有选择地允许在使用站点(最好不是模块范围内)使用显式注释。这也可以吗?

我现在想不出一种方法来做到这一点,但我认为你能得到的最接近的方法是:

  • 创建一个依赖于 time
  • 的新包 my-time
  • 重新导出带有警告注释的 shim 函数,例如

    import qualified Data.Time as Time
    {-# WARNING getCurrentTime "you should prefer getCurrentTimeMicroseconds" #-}
    getCurrentTime = Time.getCurrentTime
    
  • 取决于您的包裹中的 my-time

显然,这并没有给你一个方法来强制 not 导入 Data.Time.getCurrentTime,当你想要 shim 的代码在 Prelude 或base.

这就是类型的用途。您用于时间的类型应该反映您想要对其表示的值施加的约束。

例如,您可以像这样包装 UTCTime

newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }

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

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

并在您的包中的任何地方使用新类型,您需要多次使用此 属性。

如果您想对其严格控制,请不要导出 UTCTimeMicroseconds 构造函数,因此获得这些值之一的唯一方法是使用 microsecondsFromPicos,这会强制执行您的要求。

这会使任何误用成为错误,而不是警告,但在大多数情况下,这正是您想要的。

如果您确实想使用 UTCTime 全分辨率,或者只是不在乎,您可以照常使用该类型。在您的代码库中很容易找到发生这种情况的地方,因为它们将是 唯一 个使用 UTCTime 的地方。