假设我已经决定在给定的代码库(包)中的任何地方我都想使用自定义 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/

10-16 10:07