On Sun, Aug 14, 2005 at 08:28:33PM +0800, Autrijus Tang wrote:
: S06 made many explicit uses of generics as classes, which I find
: difficult to reconcile with the "only roles takes type parameter"
: ruling.  For example:
:     my Hash of Array of Recipe %book;
:     my Hash[returns=>Array[returns=>Recipe]] %book;
: And later:
:     class LoudArray is Array { ... }
: Clearly, here Hash and Array are used as instantiable, generic classes,
: instead of mere roles.  Does this need to change, or can we lift the
: ban on type-parameterized classes?

I think the distinction is still useful to document that there are
still unbound types.  What we need to emphasize is that a role can be
used as a class, at which point any unbound types are bound to Any,
or whatever we're calling it these days.  I'd say Array is a role,
not a class.  So these all might do different things:

    class LoudArray is Array { ... }
    role LoudArray does Array { ... }
    role LoudArray is Array { ... }

Interestingly, what is bound by trait as a container type can still be
a role rather than a class, since the actual class might not be instantiated
till we know the shape, and that might not be known till the time of
elaboration of the variable declaration:

    my num @array is shape($x,$y);

That's assuming we treat shapes as a type signature...  It doesn't have to
be for integer indexes, maybe, but for hashes:

    my Fight %hash is shape(Dog,Cat);

it looks susupiciously like a type signature.  Maybe it should be written:

    my Fight %hash :(Dog,Cat);

or even

    my %hash :(Dog,Cat --> Fight);


Reply via email to