Подтвердить что ты не робот

Реэкспорт квалифицирован?

предположим, что у вас есть два модуля типа

module Foo.A where

foo = 42

и

module Foo.B where

foo = 12

и вы хотите написать супер модуль

module Foo (
      module Foo.A
    , module Foo.B
    ) where

import Foo.A
import Foo.B

который реэкспортирует эти модули, вы получите столкновение имен.

Есть ли решение для этого?

4b9b3361

Ответ 1

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

  • Используйте одно и то же имя в нескольких разных модулях (например, newButton в Graphics.UI.Gtk.Buttons.Button и Graphics.UI.Gtk.Buttons.CheckButton)
  • Предоставьте пользователю возможность импортировать все эти модули с помощью одного оператора импорта

Теперь, если вы хотите повторно собрать несколько модулей вместе, вы можете:

  • Избегайте повторного использования имен в модулях, которые вы хотите повторно экспортировать.
  • При необходимости используйте классы типов, чтобы одно и то же имя использовалось для нескольких целей.

Ответ 2

Хороший вопрос. Отчет Haskell описывает это:

Списки экспорта являются кумулятивными: набор объектов, экспортируемых в список экспорта, представляет собой объединение объектов, экспортируемых отдельными элементами списка.

[...]

Неквалифицированные имена объектов, экспортируемых модулем, должны быть разными (в пределах их соответствующего пространства имен).

Согласно моим ограниченным знаниям Хаскелла, я бы сказал, что это невозможно.