6.4.4. Type operators
- TypeOperators
- Implies:
- Since:
- 6.8.1 
 - Allow the use and definition of types with operator names. 
The language TypeOperators allows you to use infix operators
in types.
- Operator symbols are constructors rather than type variables (as they are in terms). 
- Operator symbols in types can be written infix, both in definitions and uses. For example: - data a + b = Plus a b type Foo = Int + Bool 
- Alphanumeric type constructors can now be written infix, using backquote syntax: - x :: Int `Either` Bool x = Left 5 
- There is now some potential ambiguity in import and export lists; for example if you write - import M( (+) )do you mean the function- (+)or the type constructor- (+)? The default is the former, but with- ExplicitNamespaces(which is implied by- TypeOperators) GHC allows you to specify the latter by preceding it with the keyword- type, thus:- import M( type (+) ) 
- The fixity of a type operator may be set using the usual fixity declarations but, as in Infix type constructors, classes, and type variables, the function and type constructor share a single fixity. 
- There is now potential ambiguity in the traditional syntax for data constructor declarations. For example: - type a :+: b = Either a b data X = Int :+: Bool :+: Char - This code wants to declare both a type-level - :+:and a term-level- :+:(which is, generally, allowed). But we cannot tell how to parenthesize the data constructor declaration in- X: either way makes sense. We might imagine that a fixity declaration could help us, but it is awkward to apply the fixity declaration to the very definition of a new data constructor. Instead of declaring delicate rules around this issue, GHC simply rejects if the top level of a traditional-syntax data constructor declaration uses two operators without parenthesizing.