Spec-Zone.ru › Haskell 9

6.4.4. Операторы типов

TypeOperators
Подразумевает:

ExplicitNamespaces

Начиная с версии:

6.8.1

Статус:

Включено в GHC2024, GHC2021

Разрешает использовать и определять типы с именами-операторами.

Язык TypeOperators позволяет использовать инфиксные операторы в типах.

  • Символы операторов являются конструкторами, а не переменными типов (как в выражениях).
  • Символы операторов в типах можно записывать в инфиксной форме как в определениях, так и при использовании. Например:

    data a + b = Plus a b
    type Foo = Int + Bool
    
  • Алфавитно-цифровые конструкторы типов теперь можно записывать в инфиксной форме, используя синтаксис с обратными кавычками:

    x :: Int `Either` Bool
    x = Left 5
    
  • Теперь в списках импорта и экспорта возможна неоднозначность; например, если написать import M( (+) ), имеется ли в виду функция (+) или конструктор типа (+)? По умолчанию подразумевается первое, но с ExplicitNamespaces (которое подразумевается расширением TypeOperators) GHC позволяет указать второе, добавив перед ним ключевое слово type:

    import M( type (+) )
    

    См. раздел Явные пространства имён в импорте и экспорте.

  • Ассоциативность оператора типа можно задать с помощью обычных объявлений ассоциативности, но, как и в случае с Инфиксными конструкторами типов, классами и переменными типов, функция и конструктор типа используют одну и ту же ассоциативность.
  • Теперь в традиционном синтаксисе объявлений конструкторов данных возможна неоднозначность. Например:

    type a :+: b = Either a b
    data X = Int :+: Bool :+: Char
    

    Этот код пытается объявить и :+: на уровне типов, и :+: на уровне выражений (что в целом допустимо). Но невозможно определить, как расставить скобки в объявлении конструктора данных в X: оба варианта имеют смысл. Можно было бы предположить, что поможет объявление ассоциативности, но применять его непосредственно к определению нового конструктора данных неудобно. Вместо того чтобы вводить сложные правила для этого случая, 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.14.1/docs/users_guide/exts/type_operators.html

Spec-Zone.ru

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