在Perl 6中,对逗号运算符进行三角形缩减会生成一个列表列表,每个列表都会从输入列表中添加一个连续的元素:
> [\,] 1..5
((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)
挺棒的!但最近我想知道它是如何运作的.
如果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))
Run Code Online (Sandbox Code Playgroud)
Jon*_*ton 10
这是因为infix:<,>运算符是列表关联的.关联性通常是关于决定事物是分组还是组(或根本不组).Perl 6还认识到一些运营商以"扁平"方式关联,我们只希望运营商分离的所有值立即提供给运营商实施.
如果我们声明一个具有默认关联性的运算符并使用它:
sub infix:<a>(*@a) {
say @a.perl;
return @a.elems;
};
say [\a] 1..5;
Run Code Online (Sandbox Code Playgroud)
然后只用成对的元素调用它,给出输出:
[1, 2]
[2, 3]
[2, 4]
[2, 5]
(1 2 2 2 2)
Run Code Online (Sandbox Code Playgroud)
但是,通过添加is assoc('list')特征将其更改为列表关联:
sub infix:<a>(*@a) is assoc('list') {
say @a.perl;
return @a.elems;
};
say [\a] 1..5;
Run Code Online (Sandbox Code Playgroud)
然后输出是:
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
这是如何infix:<,>得到其漂亮的三角形减少行为.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |