-------------------------------------------
Improve the "stragely-kinded tyvar" problem
-------------------------------------------
When the type checker finds a type variable with no binding,
which means it can be instantiated with an arbitrary type, it
usually instantiates it to Void. Eg.
length []
===>
length Void (Nil Void)
But in really obscure programs, the type variable might have
a kind other than *, so we need to invent a suitably-kinded type.
This commit uses
Void for kind *
List for kind *->*
Tuple for kind *->...*->*
which deals with most cases. (Previously, it only dealt with
kind *.)
In the other cases, it just makes up a TyCon with a suitable
kind. If this gets into an interface file, anyone reading that
file won't understand it. This is fixable (by making the client
of the interface file make up a TyCon too) but it is tiresome and
never happens, so I am leaving it.
Most of the added lines are comments.