元素成员在 Perl 6 中如何工作?

How does element membership work in Perl 6?

考虑这个例子

my @fib =  (1,1, * + * … * > 200).rotor(2 => -1); 
say @fib[0] ∈  @fib; # prints True

第一条语句创建了一个 Sequence of 2-element subsequences via the use of the rotor 函数。 @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 中是否内置了一个。