Как членство в элементах работает в Perl 6?

Рассмотрим этот пример

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␤»

Итак, я предполагаю, что использует идентичность объекта, а не равенство. В таком случае, как мы можем проверить, в наборах или последовательностях списков, включен ли независимо сгенерированный список с помощью этого оператора? Следует ли нам использовать другую стратегию?

Возможно, возникает подвопрос, почему одни и те же литералы генерируют совершенно разные объекты, но, вероятно, на этот вопрос есть хороший и, скорее всего, связанный с безопасностью ответ.

«Итак, я полагаю, что ∈ использует идентичность объекта, а не равенство». Да, операторы набора все семантически изменяют все, что задано необходимой структуре QuantHash. В случае @fib[0] ∈ @fib, вы должны учитывать, что правая часть нанесла на него .Set, что эквивалентно @fib[0] ∈ @fib.Set. А Set работают с идентификаторами объектов. Некоторые случаи могли быть оптимизированы для повышения производительности. В случае «@fib [0] ∈ @ fib» внутренне выполняется функциональный эквивалент [email protected]( { .WHICH eq @fib[0].WHICH } ), так что на самом деле ему не нужно обрабатывать все значения.

Elizabeth Mattijsen 25.05.2018 11:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
1
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Elizabeth Mattijsen 25.05.2018 10:57

@ElizabethMattijsen +1, но, пожалуйста, назовите его Tuple, а не Parcel: D.

moritz 25.05.2018 12:33

Другие вопросы по теме