On 8/11/05, TSa <[EMAIL PROTECTED]> wrote:
> HaloO,
>
> Autrijus Tang wrote:
> > On Thu, Aug 11, 2005 at 08:02:00PM +1000, Stuart Cook wrote:
> >> my Foo ::x;
> >>a) ::x (<=) ::Foo (i.e. any type assigned to x must be covariant wrt. Foo)
> >>b) ::x is an object of type Foo, where Foo.does(Class)
> >>c) Something else?
> >
> > My current reading is a) -- but only if ::x stays implicitly
> > "is constant". So your "assigned" above should read "bound".
>
> Same reading here! ::x is declared as a subtype of Foo.
>
> Note that the subtype relation is *not* identical to the
> subset relation, though. E.g. Foo (=) (1,2,3) gives
> Foo (<=) Int but Foo is not a subtype of Int if Int requires
> e.g. closedness under ++. That is forall Int $x the constraint
> $t = $x; $x++; $t + 1 == $x must hold. Foo $x = 3 violates
> it because 4 is not in Foo.
That's perfectly okay. The following is a valid subtype in Perl:
subtype Odd of Int where { $_ % 2 == 1 };
Even though it doesn't obey the algebraic properties of Int.
The way to state algebraic properties of a type is the same way as in
Haskell: use type classes.
macro instance (Type $type, Role $class) {
$type does $role; ""
}
role Addable[::T] {
multi sub infix:<+> (T, T --> T) {...}
}
instance Addable[Int], Int;
This would require the definition of a "multi sub infix:<+> (Int, Int
--> Int)", thus declaring that Ints are closed under addition.
However, the subtype Odd above also does Addable, but it does
Addable[Int], not Addable[Odd]. That means that you can add two Odds
together and all you're guaranteed to get back is an Int.
Hmm, if we can have K&R C-style where clauses on subs, then we can
constrain certain parameters in the signature. For instance:
sub foo ($x, $y)
where Int $x
where Int $y
{...}
Using this style, we can constrain types as well:
sub foo (T $x, T $y)
where Addable[T] ::T
{...}
foo is now only valid on two types that are closed under addition.
Notationally this has a few problems. First, you introduce the
variable ::T after you use it, which is parserly and cognitively
confusing. Second, you say T twice. Third, there is a conflict in
the returns clause:
sub foo ($x) returns Int
where Int $x
{...}
The where there could go with Int as a subtype or with foo as a constraint.
Luke