在Perl6中,对逗号运算符进行三角形缩减会生成一个列表列表,每个列表都从输入列表中添加一个连续的元素:
> [\,] 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], ...)
. 在我原来的情况下
运算
是
,
,则输出列表的第一个元素应该只是
@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))