Возможно, да, поскольку подмножества - это типы, которые могут зависеть от произвольных условий. Однако система типов будет классифицирована как ненадежная, поскольку инварианты типов не применяются.
В частности, ограничение типа переменной проверяется только при назначении, поэтому модификации объекта, которые заставляют его выпадать из подмножества, приведут к переменной, содержащей объект, который он не должен иметь, например
subset OrderedList of List where [<=] @$_;
my OrderedList $list = [1, 2, 3];
$list[0] = 42;
say $list ~~ OrderedList;
Вы можете использовать некоторые мета-объекты мастера, чтобы система объектов автоматически проверяла тип после любого вызова метода, помещая объекты в прозрачные охраняемые объекты.
Наивная реализация могла бы выглядеть так:
class GuardHOW {
has $.obj;
has $.guard;
has %!cache =
gist => sub (Mu \this) {
this.DEFINITE
?? $!obj.gist
!! "({ self.name(this) })";
},
UNBOX => sub (Mu $) { $!obj };
method find_method(Mu $, $name) {
%!cache{$name} //= sub (Mu $, |args) {
POST $!obj ~~ $!guard;
$!obj."$name"(|args);
}
}
method name(Mu $) { "Guard[{ $!obj.^name }]" }
method type_check(Mu $, $type) { $!obj ~~ $type }
}
sub guard($obj, $guard) {
use nqp;
PRE $obj ~~ $guard;
nqp::create(nqp::newtype(GuardHOW.new(:$obj, :$guard), 'P6int'));
}
Это приведет к сбою в следующем:
my $guarded-list = guard([1, 2, 3], OrderedList);
$guarded-list[0] = 42;
person
Christoph
schedule
16.08.2016