GHC позволяет конструкторам типов, классам и переменным типов быть операторами и записываться инфиксным способом, очень похожим на выражения. Более конкретно:
- Конструктор типа или класс может быть любым нерезервированным оператором. Символы, используемые в типах, всегда похожи на идентификаторы с заглавной буквы; они никогда не являются переменными. Обратите внимание, что это отличается от лексической синтаксической конструкции конструкторов данных, которые обязаны начинаться с
:. -
Декларации типов данных и синонимов типов могут быть записаны инфиксным способом, в скобках, если нужно указать дополнительные аргументы. Например,
data a :*: b = Foo a b type a :+: b = Either a b class a :=: b where ... data (a :**: b) x = Baz a b x type (a :++: b) y = Either (a,b) y
-
Типы и ограничения классов могут быть записаны инфиксным способом. Например,
x :: Int :*: Bool f :: (a :=: b) => a -> b
- Обратные кавычки работают так же, как и для выражений, как для конструкторов типов, так и для переменных типов; например,
Int `Either` Bool, илиInt `a` Bool. Аналогично, скобки работают так же; например,(:*:) Int Bool. -
Фиксированность может быть объявлена для конструкторов типов или классов, точно так же, как и для конструкторов данных. Однако невозможно отличить их в объявлении фиксированности; объявление фиксированности задает фиксированность для конструктора данных и соответствующего конструктора типов. Например:
infixl 7 T, :*:
устанавливает фиксированность для обоих конструкторов типов
Tи конструктора данныхT, и аналогично для:*:. - Функциональная стрелка
->являетсяinfixrс фиксированностью -1.