假设我已经决定,在给定代码库(包)中的任何地方,我都想使用自定义getCurrentTimeMicroseconds
而不是getCurrentTime
。是否有办法让GHC仅在该代码库中发出有关getCurrentTime
使用的警告? (不适用于上游或下游。)
奖金问题,假设我想在使用站点(最好不在模块范围)选择性地允许使用带有显式注释的用法。这还可能吗?
答案 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
中时,满意度甚至更低。