如何使GHC针对给定功能发出警告?

时间:2019-01-18 16:22:53

标签: haskell ghc

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

奖金问题,假设我想在使用站点(最好不在模块范围)选择性地允许使用带有显式注释的用法。这还可能吗?

2 个答案:

答案 0 :(得分:3)

这是用于什么类型的。您用于时间的类型应反映您希望对其表示的值施加的约束。

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

newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }

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

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

并在需要花费时间拥有此属性的包中的所有位置使用新类型。

如果您要严格执行此操作,请不要导出UTCTimeMicroseconds构造函数,因此获取这些值之一的唯一方法是使用microsecondsFromPicos,它可以满足您的要求。

这会导致任何误用错误,而不是警告,但是在大多数情况下,这仍然是您想要的。

当您确实想以完整分辨率使用UTCTime时,或者根本不在乎时,可以照常使用该类型。在代码库中很容易找到发生这种情况的地方,因为它们只是使用UTCTime 地方。

答案 1 :(得分:1)

我现在想不出一种方法,但是我认为最接近的方法是:

  • 创建一个依赖于google.maps.event.addListener(map_marker, 'click', function () { info_window.setContent(this.html) info_window.open(self.map, this) document.querySelector("#js-reset-zoom").classList.remove('active') }) this.map_markers.push( map_marker ) 的新软件包my-time
  • 重新导出带有警告注释的垫片功能,例如

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

很显然,这不能让您强制执行 not 导入my-time,并且当您要填充的代码位于Prelude或Data.Time.getCurrentTime中时,满意度甚至更低。