-
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 просто отклоняет, если верхний уровень объявления конструктора данных в традиционном синтаксисе использует два оператора без скобок.