Реэкспорт квалифицирован?
предположим, что у вас есть два модуля типа
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
который реэкспортирует эти модули, вы получите столкновение имен.
Есть ли решение для этого?
Ответы
Ответ 1
В принципе, нет. Это был давний запрос функции таких людей, как авторы Gtk2hs. Gtk2hs имеет очень широкую иерархию модулей, где это может иметь смысл для обоих:
- Используйте одно и то же имя в нескольких разных модулях (например, newButton в Graphics.UI.Gtk.Buttons.Button и Graphics.UI.Gtk.Buttons.CheckButton)
- Предоставьте пользователю возможность импортировать все эти модули с помощью одного оператора импорта
Теперь, если вы хотите повторно собрать несколько модулей вместе, вы можете:
- Избегайте повторного использования имен в модулях, которые вы хотите повторно экспортировать.
- При необходимости используйте классы типов, чтобы одно и то же имя использовалось для нескольких целей.
Ответ 2
Хороший вопрос. Отчет Haskell описывает это:
Списки экспорта являются кумулятивными: набор объектов, экспортируемых в список экспорта, представляет собой объединение объектов, экспортируемых отдельными элементами списка.
[...]
Неквалифицированные имена объектов, экспортируемых модулем, должны быть разными (в пределах их соответствующего пространства имен).
Согласно моим ограниченным знаниям Хаскелла, я бы сказал, что это невозможно.