Treat type operators as constants, not variables.
authorIavor S. Diatchki <iavor.diatchki@gmail.com>
Sun, 16 Jan 2011 21:44:28 +0000 (13:44 -0800)
committerIavor S. Diatchki <iavor.diatchki@gmail.com>
Sun, 16 Jan 2011 21:44:28 +0000 (13:44 -0800)
commitb40cea3e36672aecae80498956341036bd70c566
tree7435b0257b626147e0b881ddd19b7ffe595f8e5f
parent7f2305281b3103c26509ce1f46297f8fd89aea4e
Treat type operators as constants, not variables.

Modifies the parser to treat all infix operators at the type level
as constants, not type variables.

This allows us to make definitions such as this:

>  data a + b = Test

Change to import/exports
~~~~~~~~~~~~~~~~~~~~~~~~

With this change, writing (+) in an import/export specification is
ambiguous because it is not clear if we should be importing/exporting
the value level (+) or the type level one, or both.

We solve this as follows:

- Specifications which have subrodinates are aways types.
  For example, T(), F(..), and (+)() all refer to types.

- Specification which do not have subbordinates remain unchanged:
  - variable names refer to values:   f, (+)
  - constructor names refer to types: T, F, (:+)

- Because (+)() looks odd, we also add a bit of new syntax.  Writing:

> type (+)

is an abbreviation for:

> (+)()

(i.e., it imports/exports a type or class without any of its subordinates).

To avoid clutter, we also allow multiple type/class constructors to be
mentioned in a single 'type' specificatoin.  For example:

>  type (+) (-) TypeNat

imports/exports all of the specified types/classes.
compiler/basicTypes/OccName.lhs
compiler/parser/Parser.y.pp
compiler/parser/RdrHsSyn.lhs