递归地展平多维数组

Fer*_*ata 9 arrays multidimensional-array perl6

平面多维数组的最短方法是什么?
以下是我的意思的一些例子:

# 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
Run Code Online (Sandbox Code Playgroud)

是否有可能以递归方式展平数组数组,例如@b不写入以递归方式下降到其中的子数据或者对其维数的数量有任何了解?
我问这个是因为我相信编译器(现在或将来的实现)能够优化基于操作员的解决方案而不是sub.

Chr*_*oph 7

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

say do gather @b.deepmap(*.take);
Run Code Online (Sandbox Code Playgroud)

应该这样做.

如果你不关心扁平化结果的顺序,

say do gather @b>>.take;
Run Code Online (Sandbox Code Playgroud)

也可能是一个选项,虽然我觉得(ab)使用超级算子来副作用感觉不对...


直到正确处理Hyper,raiph建议的切片到达核心,你可以添加自己的糖来@b[**]覆盖这个特定的用例

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

  • :) .oO([来到`6.f`](http://design.perl6.org/S09.html#Mixing_subscripts):`@calendar {July;**[0..2;*-3. .* - 1]}#七月前三天的最后三个工作小时.) (2认同)