假设我已经决定在给定的代码库(包)中的任何地方我都想使用自定义 getCurrentTimeMicroseconds
而不是 getCurrentTime
。有没有办法让 GHC 仅在该代码库中就 getCurrentTime
的使用发出警告? (不适用于任何上游或下游。)
额外的问题,假设我想有选择地允许在使用站点(最好不是模块范围内)带有显式注释的用法。这也可以吗?
最佳答案
这就是类型的用途。您用于时间的类型应反射(reflect)您希望对其所代表的值施加的约束。
例如,您可以像这样包装 UTCTime
:
newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }
microsecondsFromPicos :: UTCTime -> UTCTimeMicroseconds
microsecondsFromPicos = ...
getCurrentTimeMilliseconds :: IO UTCTimeMicroseconds
getCurrentTimeMilliseconds = microsecondsFromPicos <$> getCurrentTime
并在您需要时间才能拥有此属性的包中的任何地方使用新类型。
如果您想严格执行,请不要导出
UTCTimeMicroseconds
构造函数,因此获取这些值之一的唯一方法是使用 microsecondsFromPicos
,它会强制执行您的要求。这会使任何误用成为错误,而不是警告,但在大多数情况下,这正是您想要的。
当您确实想以完整分辨率使用
UTCTime
或只是不关心时,您可以像往常一样使用该类型。很容易在代码库中找到发生这种情况的地方,因为它们将是唯一使用 UTCTime
的地方。关于haskell - 如何让 GHC 为给定函数发出警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54257838/