On Fri, May 02, 2008 at 11:34:33AM +0200, TSa wrote:
> My idea is that foo:( Foo &f ) should mean the same as
> foo:( Foo $x ), that is the variables have to contain a
> value that does Foo.

No, I think &f should be treated more like @f and %f as a composite
object with a normal return type for the standard usage of the object.
Just as @ already implies "Array of" and % already implies "Hash of",
so too & already implies "Function of".

> Note that this implies that
>
>   sub mysub {...}
>
> occupies two slots in the surrounding namespace &mysub and
> ::mysub. The latter is a type that can be used as
>
>   sub mysubuser ( mysub &f ) {...}
>
>   sub yoursub does mysub {...}
>
>   mysubuser( &yoursub ); # OK
>
>   sub blahh (Int $x) does mysub {...} # composition error

I don't think most people want to think of functions as types--it just
clutters up the type namespace.  They can already say:

    sub mysubuser ( &f where &mysub.sig ) {...}

or some such to do explicit smartmatching against the &f object.
Alternately if they really want the type they can say

    subset mysub of Code where &mysub.sig;
 
    sub mysubuser ( &f where mysub ) {...} # note &
    sub mysubuser ( mysub $f ) {...}       # note $

Larry

Reply via email to