Spec-Zone.ru › Haskell 9

6.3.4. Явные пространства имён в import/export

ExplicitNamespaces
Подразумевается:

TypeOperators, TypeFamilies

С:

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.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/explicit_namespaces.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API