Рекурсивно сгладить многомерный массив - PullRequest
0 голосов
/ 13 октября 2018

Какой самый короткий способ выровнять многомерный массив?
Вот несколько примеров того, что я имею в виду:

# 2D array
my @a = [1,2],[3,4];
say @a».Slip.flat;                # prints (1 2 3 4)
# 3D array
my @b = [[1,2],[3,4]],[[5,6],[7,8]];
say @b».Slip».flat».Slip.flat;    # prints (1 2 3 4 5 6 7 8)
                                  # but needs to know how many dimensions
                                  # there are to flatten

Можно ли рекурсивно сгладить массив массивов, таких как @b, без записиподпрограмма, которая рекурсивно спускается в нее или имеет какие-либо сведения о количестве ее измерений?
Я спрашиваю об этом, потому что доверяю компилятору (сейчас или в будущей реализации) иметь возможность оптимизировать больше решение на основе операторачем саб.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018
say @a>>.List.flat

должен добиться цели, однако я заметил, что Range нарушит рекурсию:

my @a = [[1,2],[3,4],5,[6,7],[8,9,0],[[1,[2,3,4,[ 23,56,^7]],5,6,]],7,8,9,0];
say @a>>.List.flat;   #prints (1 2 3 4 5 6 7 8 9 0 1 2 3 4 [23 56 ^7] 5 6 7 8 9 0)

Я не знаю, является ли это ошибкой или нет.

0 голосов
/ 13 октября 2018

Не уверен, что есть более компактный способ, но

say do gather @b.deepmap(*.take);

должен это сделать.

Если вам не важен порядок уплощенного результата,

say do gather @b>>.take;

также может быть вариантом, хотя для меня «неправильно» (ab) использовать гипероператоры для побочных эффектов ...


До тех пор, пока не будет получена правильная обработка HyperWh независимо от нарезки, предложенной raiphв основном, вы можете добавить свой собственный сахар @b[**], охватывающий этот конкретный вариант использования, через

multi sub postcircumfix:<[ ]>(\SELF, HyperWhatever:D $, *% where !*) {
    gather SELF.deepmap(*.take);
}
...