Поле mixins
в файлах Cabal (я думаю, что Stack также поддерживает это) можно использовать для переименования, скрытия или теневых модулей.
Например, если мы имеем Удобная библиотека или пакет с модулем 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:
-- switcheroo happens here
base hiding (Prelude),
myprelude (MyPrelude as Prelude),
-- internal convenience library, could be an external package
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 tweaked-prelude
build-depends:
base ^>=4.12.0.0,
myprelude
mixins:
base hiding (Prelude),
myprelude (MyPrelude as Prelude),
library
import: tweaked-prelude
exposed-modules: Foo
hs-source-dirs: lib
default-language: Haskell2010