Устаревать или скрывать модуль или функцию из сторонней библиотеки - PullRequest
2 голосов
/ 14 января 2020

В нашем проекте (проект cabal с разделами исполняемого файла и библиотеки) мы иногда реализуем «более безопасные» или улучшенные версии стандартных функций, например, base и экспортируем измененную версию модуля в новое пространство имен, например,

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

Это позволяет нам использовать лучший API без фиксации большого рефакторинга (мы можем перейти к Data.Foo.Extended в других частях кодовой базы постепенно).

Но как только мы решим переместиться на *.Extended везде, где нам нужен способ выдавать предупреждение, когда устаревший (стандартный) модуль импортируется (или, возможно, когда используются определенные функции), так что изменение остается в силе.

DEPRECATED Прагма не будет работать, так как нам не принадлежит код, который мы устарели

Есть ли умный способ:

  • скрыть модуль из проекта (кроме нашей шим)?
  • тень на наш собственный модуль?
  • выдает какое-то предупреждение (то есть, чтобы идея DEPRECATED работала)?

1 Ответ

1 голос
/ 14 января 2020

Поле 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
...