从第三方库中弃用或屏蔽模块或函数

问题描述 投票:1回答:1

[在我们的项目(带有可执行文件和库部分的阴谋项目)中,有时我们会实现“安全”或改进版本的标准功能,例如base并在新的名称空间中导出模块的调整版本,例如

module Data.Foo.Extended (module Data.Foo, foo) where
import Data.Foo hiding (foo)
foo = someSaferVersionOfFoo

[这使我们可以使用更好的API,而无需进行大的重构(我们可以逐步将其移至代码库其他部分的Data.Foo.Extended。]

但是一旦我们决定移至*.Extended,我们希望有一种方法在导入旧版(标准)模块时(或也许在使用某些功能时)发出警告,以使更改得以保留。

[DEPRECATED pragma无法正常工作,因为我们不拥有将弃用的代码

是否有聪明的方法:

  • 隐藏项目中的模块(我们的垫片除外)?
  • 用我们自己的模块遮盖吗?
  • 发出某种警告(即使DEPRECATED想法生效)?
haskell ghc cabal deprecation-warning
1个回答
0
投票

mixins子句可以在Cabal文件中使用(我相信Stack也支持它)来重命名,隐藏或阴影模块。

例如,假设我们有一个带有mixins模块的便捷库或软件包,我们可以通过这种方式隐藏另一个库的标准MyPrelude

Prelude

[library -- in this library, Prelude is really MyPrelude exposed-modules: Foo hs-source-dirs: lib default-language: Haskell2010 build-depends: base ^>=4.12.0.0, myprelude mixins: base hiding (Prelude), myprelude (MyPrelude as Prelude), library myprelude -- MyPrelude uses Prelude normally, might even re-export it exposed-modules: MyPrelude hs-source-dirs: lib-prelude default-language: Haskell2010 build-depends: base ^>=4.12.0.0 build-depends子句也可以放入mixins中,以便在跨多个可执行文件/库的同一模块中出现阴影时重复:

common stanzas
© www.soinside.com 2019 - 2024. All rights reserved.