Возможно, что, поскольку подмножества являются типами, которые могут зависеть от произвольных условий. Однако система типов будет классифицирована как несостоятельная, поскольку инварианты типа не применяются.
В частности, типа ограничение действия переменного проверяются только на уступках, поэтому модификация объект, которые делают его падение из подмножества приведет к переменному проведению объекта не должен быть в состоянии, например,
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;
Ну, в том смысле, что PERL 6 имеет «типы в зависимости от значений», то да конечно. По этому определению также C. Но только индексированные типы не очень полезны сами по себе. – Ven
FWIW [Я также рассматривал захват параметризованных ролей] (https://github.com/vendethiel/6meta-experiments/blob/master/church.pl), но работает только версия 'count' (которая развязывает их во время выполнения) ,Ролям понадобится фаза «создания экземпляра» (например, шаблоны C++), чтобы получить что-то похожее на зависимые типы, но это не в меню :-). – Ven
@Ven. Похоже, что приемлемое определение зависимой типизации может быть чем-то вроде «достаточно полезных/общих компиляций, полностью разрешимых предикатов проверки типов, которые зависят от значений», так что в 2017 году индексированные типы ванили не учитываются, потому что они не считается полезным или достаточно общим, но проверяет тип, который делает подходящим использование решателя SMT. Поэтому даже если P6 был таким, что компилятор мог анализировать предложения 'where' и превращать' where Int | Str | Ограничение типа IntStr' во время проверки типа компиляции (может ли это когда-либо сделать?), Это все равно не будет зависеть от ввода. Это близко? – raiph