Prawdopodobnie tak, jako podzbiory są to typy, które mogą zależeć od arbitralnych warunków. Jednak system typów zostałby sklasyfikowany jako niesłuszny, ponieważ niezmienniki typu nie są egzekwowane.
zwłaszcza o zmiennej do kolumny jest tylko zaznaczone na zlecenie, to modyfikacje przedmiotu, które sprawiają, że wypadają z podzbioru doprowadzi do zmiennej trzymania przedmiotu nie powinien być w stanie, na przykład
subset OrderedList of List where [<=] @$_;
my OrderedList $list = [1, 2, 3];
$list[0] = 42;
say $list ~~ OrderedList;
Możesz użyć jakiegoś kreatora meta-obiektu, aby system obiektowy automatycznie sprawdzał typ po wywołaniu dowolnej metody, umieszczając obiekty w przezroczystych obiektach wartowniczych.
Naiwny realizacja mogłaby wyglądać następująco:
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'));
}
To spowoduje, że po nie:
my $guarded-list = guard([1, 2, 3], OrderedList);
$guarded-list[0] = 42;
Cóż, w takim sensie, że perl 6 ma „typy w zależności od wartości”, to tak pewnie. Zgodnie z tą definicją, C także to robi. Ale tylko posiadanie indeksowanych typów nie jest zbyt użyteczne. – Ven
FWIW, [rozważałem również porwanie sparametryzowanych ról] (https://github.com/vendethiel/6meta-experiments/blob/master/church.pl), ale działa tylko wersja 'count' (która usuwa je w czasie wykonywania) .Role wymagałyby fazy "tworzenia instancji" (jak szablony C++), aby uzyskać coś podobnego do typów zależnych, ale tego nie ma w menu :-). – Ven
@Ven To brzmi jak dopuszczalna definicja zależnego pisania może być czymś w rodzaju "wystarczająco użytecznej/ogólnej kompilacji w pełni rozstrzygającej typowej kontroli predykatów, które zależą od wartości", więc w 2017 r. Typy indeksowane w wanilii się nie liczą, ponieważ są nie jest uważany za przydatny lub wystarczająco ogólny, ale sprawdza typ, który w odpowiedni sposób wykorzystuje solwer SMT. Więc nawet jeśli P6 był taki, że kompilator mógł analizować klauzule "where" i zamieniać 'where Int | Str | Ograniczenie typu IntStr' do sprawdzania typu w czasie kompilacji (czy może to kiedykolwiek zrobić?), Nadal nie będzie zależne od wpisywania. Czy to jest blisko? – raiph