【问题标题】:Mapping a function over a multidimensional array in scala在scala中的多维数组上映射函数
【发布时间】:2012-04-06 21:41:35
【问题描述】:

我知道有一种简洁的方法可以将函数 f:A => B 映射到数组上,foo 类型为 Array[A] 以通过 foo.map{f} 获得 Array[B]。

有没有一种简洁的方法将f 映射到bar:Array[Array[A]] 以获得Array[Array[B]],在将所有A 元素映射到B 类型的元素时保留bar 的数组结构?

一般来说,有没有办法映射任意维度数组的元素(即不仅是 2D,而且是 3D、4D 等)。

【问题讨论】:

  • 这诱惑我编写自己的多维数组类型。
  • @dave -- 太棒了,告诉我进展如何。

标签: arrays scala map multidimensional-array


【解决方案1】:

您可以在地图内映射:

bar.map(_.map(f))

我怀疑是否有一种类型安全的方法来映射任意维度的数组,因为不同维度的数组属于不同的类型。但是保持嵌套映射调用很简单:

scala> val bam = new Array[Array[Array[Array[Array[A]]]]](0)
bam: Array[Array[Array[Array[Array[A]]]]] = Array()

scala> bam.map(_.map(_.map(_.map(_.map(f)))))
res1: Array[Array[Array[Array[Array[B]]]]] = Array()

实际上,我发现shapeless 具有“对任意嵌套数据结构的通用映射和折叠操作”。我没有用Array 测试过,但看起来它可以与其他数据结构一起使用。

everywhere(f)(bam)

【讨论】:

  • 这个 shapeless 项目看起来很酷,但是为了这个小用例将 shapeless 安装到我的项目中似乎有点过头了。对无形 everywhere(f)(bam) 的工作原理有何见解?比如你需要什么隐式?
  • 有一点要提一下,我希望使用 shapeless 来执行此操作会导致编译时间方面的损失,这会随着深度的增加而增加;因此我不会在您的代码中过多地使用它。我还会质疑您的数据结构的一般意义(从可读性/维护的角度来看) - 除非您正在进行一些科学编程。在这种情况下,您很可能不希望在 Array 上使用 map 产生运行时装箱开销(假设 A 是原始的)。
  • @dsg 我同意 shapeless 在这里是多余的,但是您可以轻松创建自己的一组方法来映射不同维度的数组,例如def map2[A: Manifest, B: Manifest](a: Array[Array[A]])(f: A => B) = a map (_ map f)。 (Manifest 是数组专门需要的上下文绑定。)您不能重载类型参数,但您可以创建 map3、map4 等来处理不同维度的数组。
  • 另外,map3 的主体可以简单地为a map (map2(_)(f)),等等更高维度
  • @dsg 同意过度杀伤部分。但我仍然对它感到惊讶。不确定您需要哪种导入;你必须检查来源。有关其工作原理的更多详细信息,请查看Scrap your boilerplate with class。
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多