Обычно я твердо убежден в том, что я использую пространства имен (квалифицированные имена модулей) на большинстве языков, которые я программирую, так как очень хорошо знать с первого взгляда, откуда пришел определенный идентификатор. В Haskell есть также дополнительное преимущество, позволяющее избежать общих конфликтов имен с функциями Prelude.
Однако мне кажется, что нужно разместить пространство имен на символе инфикса (или других коротких идентификаторах DSL-y), выглядит действительно странно, поэтому я испытываю соблазн переэкспортировать значения, например:
import qualified Data.Sequence as Seq
(|>) = (Seq.|>)
(<|) = (Seq.<|)
Что меня беспокоит, так это то, что
-
Вручную реэкспортные значения выглядят как скучный шаблон.
-
Значения, связанные с переэкспортированием вручную, проходят вокруг существующей системы модулей и, похоже, не работают с конструкторами данных (и, возможно, с другими вещами, с которыми я еще не сталкивался)
import qualified Data.Sequence as Seq (:>) = (Seq.:>) --gives me a parse error: --"Not in scope: data constructor `:>'"
Как скомбинировать символы infix и пространство имен? Должен ли я просто сдаваться и учиться пространству имен? Установлены ли наилучшие практики Haskell в отношении пространств имен и символов?