Это потому, что оператор 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')
trait:
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:<,>
получает свое хорошее поведение по уменьшению треугольника.