.. _type-operators:
Type operators
--------------
.. extension:: TypeOperators
:shortdesc: Enable type operators.
Implies :extension:`ExplicitNamespaces`.
:implies: :extension:`ExplicitNamespaces`
:since: 6.8.1
Allow the use and definition of types with operator names.
In types, an operator symbol like ``(+)`` is normally treated as a type
*variable*, just like ``a``. Thus in Haskell 98 you can say
::
type T (+) = ((+), (+))
-- Just like: type T a = (a,a)
f :: T Int -> Int
f (x,y)= x
As you can see, using operators in this way is not very useful, and
Haskell 98 does not even allow you to write them infix.
The language :extension:`TypeOperators` changes this behaviour:
- Operator symbols become type *constructors* rather than type
*variables*.
- 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
- 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 :extension:`ExplicitNamespaces` (which is implied by
:extension:`TypeOperators`) GHC allows you to specify the latter by
preceding it with the keyword ``type``, thus: ::
import M( type (+) )
See :ref:`explicit-namespaces`.
- The fixity of a type operator may be set using the usual fixity
declarations but, as in :ref:`infix-tycons`, the function and type
constructor share a single fixity.