-
ExplicitNamespaces -
- Подразумевается:
- С:
-
7.6.1
- Статус:
-
Включено в
GHC2024
Включает возможность использования явных пространств имён в списках экспорта модулей, шаблонах и выражениях.
В списке импорта или экспорта, таком как
module M( f, (++) ) where ... import N( f, (++) ) ...
сущности f и (++) являются значениями. Однако, с операторами типов (Операторы типов) становится возможным объявить (++) как конструктор типа. В таком случае, как вы будете экспортировать или импортировать его?
Расширение ExplicitNamespaces позволяет вам префикснуть имя конструктора типа в списке импорта или экспорта ключевым словом «type», чтобы избежать неоднозначности в этом случае, таким образом:
module M( f, type (++) ) where ... import N( f, type (++) ) ... module N( f, type (++) ) where data family a ++ b = L a | R b
Расширение ExplicitNamespaces подразумевается TypeOperators и (по каким-то причинам) TypeFamilies.
Кроме того, с PatternSynonyms вы можете префикснуть имя конструктора данных в списке импорта или экспорта ключевым словом pattern, чтобы разрешить импорт или экспорт конструктора данных без его родительского конструктора типа (см. Импорт и экспорт синонимов шаблонов).
Кроме того, ExplicitNamespaces разрешает использование ключевого слова type в шаблонах и выражениях:
f (type t) x = ... -- in a pattern r = f (type Integer) 10 -- in an expression
Это используется в сочетании с RequiredTypeArguments.
Когда ExplicitNamespaces включено, возможно использовать ключевые слова type и data для указания пространства имён имени, используемого в сигнатуре фиктивности или в предикате WARNING/DEPRECATED. Это может быть полезно для устранения неоднозначности между именами в разных пространствах имён, которые могут конфликтовать друг с другом.
Вот пример использования спецификаторов пространства имён для задания различных фиктивностей для операторов уровня типа и уровня термина:
type f $ a = f a f $ a = f a infixl 9 type $ -- type-level $ is left-associative with priority 9 infixr 0 data $ -- term-level $ is right-associative with priority 0
Аналогично, это может быть использовано в предикатах для устаревания только одного имени в пространстве имён:
data Solo = MkSolo
pattern Solo = MkSolo
{-# DEPRECATED data Solo "Use `MkSolo` instead" #-}
type family Head xs where
Head (x : _) = x
pattern Head x <- (head -> x)
{-# WARNING in "x-partial" data Head "this is a partial type synonym" #-}
Считается плохой практикой использовать сигнатуру фиктивности, предикат WARNING или предикат DEPRECATED для имени уровня типа без явного пространства имён type, и это станет ошибкой в будущих версиях GHC.