Рассмотрим этот пример
my @fib = (1,1, * + * … * > 200).rotor(2 => -1);
say @fib[0] ∈ @fib; # prints True
Первый оператор создает Последовательность из 2-элементных подпоследовательностей с помощью функции ротор. @fib будет содержать (1,1), (1,2) и так далее. Совершенно очевидно, что первый элемент последовательности является частью последовательности. Либо это?
my @fib = (1,1, * + * … * > 200).rotor(2 => -1);
say @fib[0], @fib[0].^name; # OUTPUT: «(1 1)List»
Итак, первый элемент содержит список со значением (1 1). ОК давайте посмотрим
my $maybe-element = (1,1);
say $maybe-element, $maybe-element.^name; # OUTPUT: «(1 1)List»
say $maybe-element ∈ @fib; # OUTPUT: «False»
Чего ждать? Посмотрим...
my $maybe-element = @fib[0];
say $maybe-element ∈ @fib; # OUTPUT: «True»
Гм. Значит, дело не в контейнере. Но
say (1,1).List === (1,1).List; # OUTPUT: «False»
А также
say (1,1).List == (1,1).List; # OUTPUT: «True»
Итак, я предполагаю, что ∈ использует идентичность объекта, а не равенство. В таком случае, как мы можем проверить, в наборах или последовательностях списков, включен ли независимо сгенерированный список с помощью этого оператора? Следует ли нам использовать другую стратегию?
Возможно, возникает подвопрос, почему одни и те же литералы генерируют совершенно разные объекты, но, вероятно, на этот вопрос есть хороший и, скорее всего, связанный с безопасностью ответ.





So I guess ∈ is using object identity, and not equality.
Это верно.
That being the case, how can we check, in sets or sequences of lists, if an independently generated list is included using this operator?
Вы можете использовать .grep или .first и оператор равенства по вашему выбору (предположительно, вы хотите, чтобы здесь eqv), или вы можете попытаться найти тип значения в виде списка. Я не знаю, встроен ли он в Perl 6.
Иногда мне кажется, что нам следует восстановить Parcel как подкласс List. Принуждение к Parcel создаст копию $!reified со всеми деконтированными значениями, и на основе этого будет сгенерировано значение .WHICH.
@ElizabethMattijsen +1, но, пожалуйста, назовите его Tuple, а не Parcel: D.
«Итак, я полагаю, что ∈ использует идентичность объекта, а не равенство». Да, операторы набора все семантически изменяют все, что задано необходимой структуре
QuantHash. В случае@fib[0] ∈ @fib, вы должны учитывать, что правая часть нанесла на него.Set, что эквивалентно@fib[0] ∈ @fib.Set. АSetработают с идентификаторами объектов. Некоторые случаи могли быть оптимизированы для повышения производительности. В случае «@fib [0] ∈ @ fib» внутренне выполняется функциональный эквивалент[email protected]( { .WHICH eq @fib[0].WHICH } ), так что на самом деле ему не нужно обрабатывать все значения.