[在我们的项目(带有可执行文件和库部分的阴谋项目)中,有时我们会实现“安全”或改进版本的标准功能,例如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
想法生效)?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