Решает ли Фреге вопрос "реэкспорта квалифицированных" 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
Как можно себе представить, нам нужно иметь оба !=
а также /=
во избежание жалоб сформируйте лагеря на Яве или Хаскеле соответственно.