递归展平多维数组

时间:2018-10-13 08:55:22

标签: arrays multidimensional-array perl6

展平多维数组的最短方法是什么?
这是我的意思的一些示例:

@b

是否有可能递归地展平数组Reviews Size Installs Type Price Content Rating 0 159 19M 10,000+ paid $9.99 Everyone 1 967 14M 500,000+ paid $0.99 Everyone 2 87510 8.7M 5,000,000+ paid $1.9 Everyone 3 215644 25M 50,000,000+ paid $7.50 Teen 4 967 2.8M 100,000+ Free 0 Everyone 之类的数组而无需编写子递归地递归于其中或不知道其维数的子集?
我之所以这样问,是因为我相信编译器(无论现在还是将来的实现)都比子类能够优化更多基于操作员的解决方案。

2 个答案:

答案 0 :(得分:7)

不确定是否有更紧凑的方法,但是

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

应该这样做。

如果您不希望展平结果的顺序,

say do gather @b>>.take;

也可能是一个选择,尽管我(觉得)使用超级运算符产生副作用对我来说是“错误的” ...


在对raiph建议的HyperWhats切片进行适当处理之前,您可以通过以下方式添加自己的糖@b[**]来覆盖此特定用例

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

答案 1 :(得分:0)

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)

我不知道这是否是错误。