GHC отказывается экспортировать квалифицированные модули - PullRequest
18 голосов
/ 09 июля 2010

Я хочу написать модуль, который реэкспортирует какой-либо модуль, который он импортировал, квалифицированным.Примерно так:

module Foo.A
  ( module Foo.B
  , module Foo.C
  ) where
import qualified Foo.B
import qualified Foo.C

-- bunch of code using Foo.B and Foo.C here

Похоже, это должно сработать;однако GHC выводит предупреждения об экспорте:

Foo/A.hs:2:5:
    Warning: the export item `module Foo.B' exports nothing

Foo/A.hs:3:5:
    Warning: the export item `module Foo.C' exports nothing

И GHCI отказывается загружать из них экспорт.

Я могу решить эту проблему, сделав импорт неквалифицированным, но в этом случае конфликт имен можетвозникают между этими импортами и основным кодом модуля.

Есть ли способ заставить GHC экспортировать эти модули?

Ответы [ 2 ]

13 голосов
/ 09 июля 2010

Нет, это не просто ограничение GHC, это способ импорта и экспорта, предназначенный для работы в Haskell.

Модуль имеет контроль только над своим собственным пространством имен - он не может влиять на то, чтолюди могут видеть из других пространств имен.Модуль «реэкспорт» - это просто сокращение, чтобы сказать «экспортировать все символы в моем собственном пространстве имен, которые, как оказалось, были импортированы сюда из этого другого модуля».Но символы, которые вы импортировали квалифицированно, на самом деле не находятся в вашем собственном пространстве имен.

Если вы хотите экспортировать два разных символа с одинаковыми именами, вы не сможете сделать это из одного модуля.Разделите модуль на два и экспортируйте каждую версию из другого модуля.

6 голосов
/ 30 октября 2011

Это ограничение также удобно, когда импортирующий модуль должен повторно объявлять некоторые имена в импортированном модуле на основе объявлений квалифицированного импорта. Например:

module MyPrelude (succ, module Prelude) where

import qualified Prelude as P (succ)
import Prelude hiding (succ)

succ :: ...
succ = ... P.succ ...

эту идиому было бы действительно трудно выразить без большого количества многословия в противном случае. Кроме того, спросите себя: «Будет ли это иметь смысл без иерархических модулей?». Если нет, то это очень специфично для ghc, и то, что происходит при обращении к имени иерархического модуля из выражения, вообще не является иерархическим.

Относительно того, почему вы можете реэкспортировать отдельные символы с определенным именем модуля, которое вы не импортировали, это похоже на то, как заставить иерархические модули работать иерархически в ghc. Получение квалифицированных символов Foo.B при импорте Foo.A является волшебным, и я думаю, что это потому, что имя Foo не более реальный наследник, чем Foo.A, но предполагаемое использование экспорта вещей с альтернативной квалификацией - в случаях, когда его используют из Фу. Я не думаю, что это поведение имеет смысл вообще без расширений GHC, поэтому я собираюсь сделать дикое предположение, что это специфично для GHC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...