class Metamodel::CurriedRoleHOW
        does Metamodel::Naming
        does Metamodel::TypePretense
        does Metamodel::RolePunning {}

警告:此类是 Rakudo 实现的一部分,不属于语言规范。

有时,我们看到对提供参数但未完全解析的角色的引用。例如,在

class C does R[Type{ }

我们需要表示 R[T],但由于手头没有第一个参数,因此我们还不能完全专门化角色。我们还可能遇到类似这样的问题

sub foo(R[T$x{ ... }
if $x ~~ R[T{ ... }

我们显然希望讨论角色的部分参数化,并希望以一种与特定实例化不同的方式进行讨论。此元对象将这些“部分类型”表示为一种方法,既可以继续进行完全专门化,又可以进行类型检查或双关语。

此类将显示在参数化角色中。例如

role Zipi[::T{
    method zape { "Uses " ~ T.^name };
}
role Zipi[::T, ::Y{
    method zape { "Uses " ~ T.^name ~ " and " ~ Y.^name };
}
for Zipi[Int], Zipi[Int,Str-> $role {
    say $role.HOW;
    say $role.new().zape;
}
# OUTPUT: 
# Perl6::Metamodel::CurriedRoleHOW.new 
# Uses Int 
# Perl6::Metamodel::CurriedRoleHOW.new 
# Uses Int and Str 

由于有几个 Zipi 变体,提供一个参数会对其进行处理,但编译器仍需要考虑 ParametricRoleGroup 找出实际实现,因此这些(部分实例化)角色会显示为 Metamodel::CurriedRoleHOW,如示例所示;即使只有一个参数,实例化角色的类型也会相同

role Zape[::T{};
say Zape[Int].HOW#: «Perl6::Metamodel::CurriedRoleHOW.new␤»

注意:与大多数 Metamodel 类一样,此类主要用于说明目的,不打算由最终用户实例化。