-
TypeOperators -
- Подразумевает:
- Начиная с версии:
-
6.8.1
- Статус:
Разрешает использовать и определять типы с именами-операторами.
Язык 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 просто выдаёт ошибку, если на верхнем уровне объявления конструктора данных в традиционном синтаксисе используются два оператора без скобок.