= Liberal Type Synonyms =
[[PageOutline]]
== Brief Explanation ==
See the [http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#type-synonyms GHC Documentation] on this extension.
The basic idea is that type validity checking is done ''after expanding type synonyms''.
This means, for example, that type synonyms can be written unsaturated, as long as the result of expanding synonyms leaves everything saturated. This is sometimes quite useful.
There are also interactions with [wiki:RankNTypes] - a type synonym may expand to a quantified type.
== Proposal ==
Adopt GHC's approach to type synonym expansion. Specifically, these conditions are checked only ''after'' expansion:
* No partial applications of type synonyms
* No 'forall' types as an argument to a type constructor
* An instance head is of form `C (T ...)`, where `T` is a ''data'' type.
However these conditions may be broken ''before'' expansion of type synonyms.
== Kind checking ==
Should kind checking be done before, or after expanding type synonyms? That is, should a type synonym have a fixed kind or not?
Currently GHC does kind inference before expanding type synonyms, and gives each type synonym a fixed kind. The following program is rejected:
{{{
type T f a = f a
x :: T (T (,) Int) Float
x = (1,2.0)
}}}
gives
{{{
syn.hs:5:10:
`(,)' is not applied to enough type arguments
Expected kind `* -> *', but `(,)' has kind `* -> * -> *'
In the type `T (,) Int'
In the type `T (T (,) Int) Float'
In the type signature for `x':
x :: T (T (,) Int) Float
}}}
In favour of GHC's approach is that type errors are more likely to be given in terms of types that the programmer actually wrote. However, this does reject more programs, and perhaps it would be simpler to treat type synonyms uniformly as macros, without kinds?
== References ==
* [http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#type-synonyms GHC Documentation]
== Tickets ==
[[TicketQuery(description~=LiberalTypeSynonyms)]]
== Pros ==
* Small generalisation
* Easily specified
* Quite handy
== Cons ==
* It's so ... syntactic.
* There are the usual worries about deferred checking leading to less
informative diagnostics.