Решает ли Фреге вопрос "реэкспорта квалифицированных" Haskell?

Вопрос в Хаскеле:

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

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

Обратите внимание, что может быть много функций, таких какfoo в каждом модуле (foo1, foo2 и т. д.), и я хочу использовать их из обоих модулей. Там также может быть dataв конце концов, с одинаковыми именами членов в каждом модуле. Так что скрытие не решение проблемы. Я не рассматриваю объектив для его решения.

Теперь, решает ли Фреге проблему "реэкспорта квалифицированных" Haskell? Похоже, что так и есть, если я правильно помню, но я не могу сейчас найти доказательства, может кто-нибудь уточнить это?

1 ответ

Я думаю, что нет. В Frege модуль может реэкспортировать только элементы (т.е. функции, типы, классы типов), но не модули.

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

Что вы можете сделать во Фреге:

import mod.A(foo fooA)
import mod.B(foo fooB)

который эффективно переименовывает A.foo в fooA а также B.foo в fooB в импортирующем модуле. Это работает также на реэкспорте. Например, в frege.Prelude у нас есть

import Prelude.PreludeBase public(!= /=)

Это вызовет любой, кто импортирует frege.Prelude иметь оператора /= имеется в наличии. Но это только псевдоним для != оператор Ord

Как можно себе представить, нам нужно иметь оба != а также /= во избежание жалоб сформируйте лагеря на Яве или Хаскеле соответственно.

Другие вопросы по тегам