In Parameter§

See primary documentation in context for method type captures

method type_captures(Parameter:D: --> List:D)

Returns a list of variable names of type captures associated with this parameter. Type captures define a type name within the attached code, which is an alias to the type gleaned from the argument during a call.

sub a(::T $x{ T.say }
a(8);                                       # OUTPUT: «(Int)␤» 
say &a.signature.params[0].type_captures;   # OUTPUT: «(T)␤» 
sub b($x{ $x.^name.say }
a(8);                                       # OUTPUT: «Int␤»

The type used may change from call to call. Once they are defined, type captures can be used wherever you would use a type, even later in the same signature:

sub c(::T $xT $y$z{ my T $zz = $z };
c(456);          # OK 
 
try c(45"six");
given $! { .message.say };
# OUTPUT: «Type check failed in assignment to $zz; expected Int but got Str ("six")␤» 
 
try c("four"5"six");
given $! { .message.say };
# OUTPUT: «Type check failed in binding to parameter '$y'; expected Str but got Int (5)␤» 

Type captures may be used at the same time as type constraints.

sub d(::T Numeric $xT $y{};
d(45);            # OK 
d(4e05e0);        # OK 
 
try d(4e05);
given $! { .message.say };
# OUTPUT: «Type check failed in binding to parameter '$y'; expected Num but got Int (5)␤» 
 
try d("four""five");
given $! { .message.say };
# OUTPUT: «Type check failed in binding to parameter '$x'; expected Numeric but got Str ("four")␤»