gpt4 book ai didi

raku - 逗号运算符上的三角形归约如何知道要列出所有列表?

转载 作者:行者123 更新时间:2023-12-04 03:25:18 24 4
gpt4 key购买 nike

在Perl 6中,对逗号运算符进行三角归约会产生一个列表列表,每个列表都从输入列表中添加一个连续的元素:

> [\,] 1..5
((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5))

很不错!但是最近我想知道它是如何工作的。

如果 op是任意运算符,则 [op] @list应该与 @list[0] op @list[1] op ... op @list[*-1]相同。据我了解,然后 [\op]应该是所有中间值的列表。但这似乎意味着 [\op] @list应该评估为 (@list[0], @list[0] op @list[1], @list[0] op @list[1] op @list[2], ...)。在我最初的情况下, op,,输出列表的第一个元素应该只是 @list[0],但是不是;这是一个单例列表 (@list[0],)

原始的三角形归约如何知道如何使其输出的第一个元素成为单例列表?

如果我编写自己的列表构造例程,则其工作方式将与我期望的一样:
> sub foo { |$^a, $^b }
sub foo ($a, $b) { #`(Sub|93971926296448) ... }
> [[&foo]] 1..5
(1 2 3 4 5)
> [\[&foo]] 1..5
(1 (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5))

最佳答案

这是因为infix:<,>运算符是列表关联的。关联性通常是关于确定事物是左组还是右组(或根本不分组)。 Perl 6还认识到某些运算符以“统一”方式关联,我们只希望将由运算符分隔的所有值立即提供给运算符实现。

如果我们声明一个具有默认关联性的运算符并使用它:

sub infix:<a>(*@a) {
say @a.perl;
return @a.elems;
};
say [\a] 1..5;

然后将仅用成对的元素调用它,并给出输出:
[1, 2]
[2, 3]
[2, 4]
[2, 5]
(1 2 2 2 2)

但是,通过添加 is assoc('list')特性将其更改为与列表关联的:
sub infix:<a>(*@a) is assoc('list') {
say @a.perl;
return @a.elems;
};
say [\a] 1..5;

然后输出是:
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
(1 2 3 4 5)

这是 infix:<,>如何获得其良好的三角形归约行为。

关于raku - 逗号运算符上的三角形归约如何知道要列出所有列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53797245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com