[Ur] Question about the Sum metaprogramming example
Adam Chlipala
adamc at impredicative.com
Tue Dec 8 14:17:47 EST 2009
David Snider wrote:
> "Ur's support for analysis of types is based around extensible records, or
> row types. In the definition of the sum function, we see the type parameter
> fs assigned the kind {Unit}, which stands for records of types of kind
> Unit. The Unit kind has only one inhabitant, (). The kind Type is for
> "normal" types."
>
> Could you elaborate on why you used the kind Unit instead of Type?
>
If this example used [Type] instead of [Unit], then the constructor
parameter [fs] would need to assign a type to each record field. This
goes against the point of the example, as we want to _force_ every type
to be [int]; if we gave the caller more freedom, some field might be
assigned a different type. This looser version would yield the same
functionality, but it would be harder to use with type inference. The
[Unit] version has the advantage that [Unit] has only one inhabiting
constructor, so type inference doesn't need to guess a value for each
field. It would be silly to guess a field value from a set of size
greater than one, when we are just going to overwrite these choices with
a [map].
More information about the Ur
mailing list