Represents inferred structural type. A type may be either primitive type
(one of those listed by
primitiveTypes) or it can be collection,
(named) record and heterogeneous type. We also have
Null type (which is
a subtype of all non-primitive types) and universal
For collection, we infer the types of different things that appear in the collection and how many times they do.
A heterogeneous type (sum type) is simply a choice containing one of multiple different possibilities
Why is collection not simply a list of Heterogeneous types? If we used that we would lose information about multiplicity and so we would not be able to generate nicer types!
Signature: typ:Type -> bool