Метакласс CurriedRoleHOW
представляет роль, скажем, R
, которой был задан некоторый набор параметров, например R[Int,Str]
. Он каррируется в том смысле, что роль всегда имеет неявный первый параметр, то есть класс, в который она в конечном итоге составлена, и поэтому она содержит аргументы R
и Int,Str
, а затем вводит их в тот момент, когда роль создается (время композиции).
Конечно, нельзя писать:
class Zape does Zipi[::T] {}
И ожидайте, что это сделает что-нибудь разумное; ::T
является типом capture , поэтому может входить только в подписи. Здесь он используется в качестве аргумента для создания экземпляра роли, и на него справедливо жаловались. Кроме того, class
- это всегда конкретная вещь, а не общая вещь.
Однако для роли можно каррироваться с переменной типа для последующего создания экземпляра. Дана роль с двумя параметрами типа:
role RA[::T, ::U] {
method t { T }
method u { U }
}
Мы можем написать еще одну роль, которая исправляет одну и передает другую:
role RB[::T] does RA[T, Int] { }
А затем используйте это так:
class C does RB[Str] { }
say C.t;
say C.u;
Который имеет выход:
(Str)
(Int)
В этом примере RA[T, Int]
также моделируется метаклассом CurriedRoleHOW
, за исключением того, что на этот раз у него есть отверстие T
, а также неявное ::?CLASS
, которое, я считаю, достигает того, о чем вы просили.