Реэкспорт квалифицирован? - PullRequest
25 голосов
/ 08 декабря 2010

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

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

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

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

Ответы [ 2 ]

26 голосов
/ 08 декабря 2010

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

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

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

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

Хороший вопрос. В отчете Haskell указано это :

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

[...]

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

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

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