.. _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.