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.