如何设置类的默认参数化?

Eli*_*sen 11 perl6

^parameterize方法允许用一些给定的信息(例如角色)来参数化一个类.

my role A[::T = Mu] { }

my class B {
    method ^parameterize(Mu \base, Mu \type) {
        my \what := base.^mixin(A[type]);
        what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
        what
    }
}

dd B[Int];        # B[Int]
dd B[Int].^roles; # (A[Int],)
Run Code Online (Sandbox Code Playgroud)

但是,我还没有找到一种方法来制作非参数化版本的B参数化版本的角色A.

dd B;        # B
dd B.^roles; # (), want to see (A[Mu],)
Run Code Online (Sandbox Code Playgroud)

我试图添加一个^compose方法,但只有在参数化类时才会调用它.

建议非常欢迎!

Eli*_*sen 8

我得出结论,你不能(至少在可预见的未来).所以我退后一步看看我真正希望实现的目标.而竟然是可能的:

my role A[::T] {
    method foobar() { T }
}

my class B {
    method foobar() { Mu }

    method ^parameterize(Mu \base, Mu \type) {
        my \what := base.^mixin(A[type]);
        what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
        what
    }
}

dd B.foobar;       # Mu
dd B[Int].foobar;  # Int
Run Code Online (Sandbox Code Playgroud)

该方法foobar默认由B类提供.如果一个参数化B类,它将混合该foobar方法的另一个版本(阴影原始方法),它返回参数化给出的类型.

最后,这给了我允许参数化QuantHashes 的框架,这是我自己的长期要求,最近是其他的.