Larry Wall wrote:
At the moment, I think the weakest word choice is "subtype".
People from certain cultures will confuse subtypes with subclasses.

Not to mention submethods and subroutines!

The notion of constraints or limitations is already conveyed by
"where", and some subtypes may just be aliases.

Wouldn't 'bound' work? Perhaps combined with 'on':

  bound SmallInt on Int where { 0 < $_ < 100 };


  Int bound SmallInt where { 0 < $_ < 100 };

or is 'bound of' proper english? And perhaps ranges could be allowed
in the type slot

  my 1..100 $x;

  $x = 101; # type error

And with enums

  my enum <a b c d> $x;

  $x = g; # error unless &g exists and returns a type
          # structurally equal to enum <a b c d> which
          # might be the same as 0..3

 Plus, as we've defined
them above, subtypes are the most generic type you can name in Perl.

Ahm, why? They just add predicates that have to hold true. The only
genericity I see is that a subtype declaration doesn't need anything
remotely implementation like. Not even the constraint type must be
there yet:

  subtype Blahh of ::Fasel; # declaration of Fasel deferred

  my Blahh $b .=new; # compiles for now, but needs ::Fasel eventually

BTW, could we restrict predicates to deal with the state available through
the type/kind that is constraint? This would allow compile time calculations
of contraint subsumption, type entailment and of upper and lower bounds.

Question: does a subtype declaration work only on package-like things
which are addressed with a :: sigil? Or does your 'potentially
contravariant' mean that arrow types can be constraint or aliased, as

  subtype TakesInt of Sub where { .sig =:= :(Int --> Any) };

  my TakesInt &foo;

  foo('a string'); # type error

This might actually produce the strange association of subtype
with subs and requesting corresponding methodtype, datatype,
roletype, etc. keywords for other kinds of types.

So maybe we should go with "type"...which is yet another thing I've
waffled on repeatedly...


Reply via email to