我怎样才能让 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
的地方。
假设我决定在给定的代码库(包)中的任何地方我都想使用自定义 getCurrentTimeMicroseconds
而不是 getCurrentTime
。有没有办法让 GHC 仅在该代码库中发出有关使用 getCurrentTime
的警告? (不适用于任何上游或下游。)
奖金问题,假设我想有选择地允许在使用站点(最好不是模块范围内)使用显式注释。这也可以吗?
我现在想不出一种方法来做到这一点,但我认为你能得到的最接近的方法是:
- 创建一个依赖于
time
的新包 重新导出带有警告注释的 shim 函数,例如
import qualified Data.Time as Time {-# WARNING getCurrentTime "you should prefer getCurrentTimeMicroseconds" #-} getCurrentTime = Time.getCurrentTime
取决于您的包裹中的
my-time
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
的地方。