2012-04-06 5 views
3

Я знаю, что есть чистый способ отображения функции f:A => B над массивом, foo типа Array[A] получить Array[B] через foo.map{f}.Отображение функции над многомерным массивом в Скале

Есть чистый способ отображения f над bar:Array[Array[A]] получить Array[Array[B]], который сохраняет структуру массива для bar во время отображения всех A элементов к элементам типа B?

В общем, существует способ сопоставления элементов массивов произвольных размеров (т. Е. Не только 2D, но 3D, 4D и т. Д.).

+1

Это искушает меня написать мой собственный многомерный массив. – leedm777

+0

@dave - Удивительно, дайте мне знать, как это происходит. – dsg

ответ

6

Вы можете отобразить в карте:

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) 
+0

Обновленный ответ на ссылку бесформенный. Очень круто! – leedm777

+1

Этот бесформенный проект выглядит довольно круто, но кажется, что излишний, чтобы превратить бесформенный в мой проект для этого небольшого варианта использования. Любое понимание того, как работает бесформенный «везде (f) (bam)»? Как то, что вам нужно? – dsg

+1

Следует упомянуть, что использование бесформенного для этого приведет к штрафу с точки зрения времени компиляции, которое увеличивается с увеличением глубины; поэтому я бы не использовал это слишком много в вашем коде. Я бы также поставил под сомнение смысл вашей структуры данных в целом (с точки зрения удобочитаемости/обслуживания) - если вы не занимаетесь научным программированием. В этом случае вы, возможно, не хотите нести накладные расходы бокса при использовании 'map' на' Array' (при условии, что 'A' является примитивным). –

Смежные вопросы