arrays - 递归展平多维数组

标签 arrays multidimensional-array raku

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

# 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之类的数组数组,而无需编写一个递归地降入该子集或不知道其维数的子集?
我之所以这样问,是因为我相信编译器(现在或将来的实现)比子类能够优化更多基于运算符(operator)的解决方案。

最佳答案

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

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

应该做。

如果您不在乎展平结果的顺序,
say do gather @b>>.take;

也许也是一种选择,尽管我(觉得)使用 super 运算符产生副作用对我来说是“错误的” ...

在对raiph建议的HyperWhatever切片进行适当处理之前,您可以通过以下方式添加您自己的Sugar @b[**]来覆盖此特定用例:
multi sub postcircumfix:<[ ]>(\SELF, HyperWhatever:D $, *% where !*) {
    gather SELF.deepmap(*.take);
}

关于arrays - 递归展平多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52791239/

相关文章:

java - HashMap 第一个键为空

arrays - 使用 UserDefaults 输入文本追加数组

matlab - 二变量最小二乘函数逼近

raku - Perl6 的角色中没有强制执行 stub 方法的类型签名吗?

java - 如何在 Java 中测试字符串索引是否为 Null

c++ - 计算两个数组中匹配元素的个数 C++

javascript - JQUERY - 使用键从多维数组中删除数组

javascript - 在 p5.js 中显示 map 的问题

raku - 添加两个共享相同标识符的枚举

variables - 在线程之间共享数组安全吗?