Самый краткий способ объединить элементы последовательности - PullRequest
7 голосов
/ 15 августа 2011

Скажем, у нас есть две последовательности, и мы хотим объединить их, используя некоторый метод

val a = Vector(1,2,3)
val b = Vector(4,5,6)

, например, сложение может быть

val c = a zip b map { i => i._1 + i._2 }

или

val c = a zip b map { case (i, j) => i + j }

Повторение во второй части заставляет меня думать, что это должно быть возможно за одну операцию.Я не вижу встроенного метода для этого.Я полагаю, что мне действительно нужен метод zip, который пропускает создание и извлечение кортежей.

Есть ли более приятный / более лаконичный способ в простом Scala или, может быть, в Scalaz?Если нет, то как бы вы написали такой метод и поместили его в последовательности, чтобы я мог написать что-то вроде

val c = a zipmap b (_+_)

Ответы [ 2 ]

12 голосов
/ 15 августа 2011

Существует

(a,b).zipped.map(_ + _)

, который, вероятно, достаточно близок к тому, что вы не хотите беспокоить расширением.(К сожалению, вы не можете использовать его без очков, поскольку последствия для zipped не нравятся.)

2 голосов
/ 17 августа 2011

Rex 's ответ , безусловно, является более легким выходом для большинства случаев.Однако zipped более ограничен, чем zip, поэтому вы можете наткнуться на случаи, когда он не будет работать.

В этих случаях вы можете попробовать это:

val c = a zip b map (Function tupled (_+_))

Или, в качестве альтернативы, если у вас есть функция или метод, который делает то, что вы хотите, у вас также есть эта опция:

def sumFunction = (a: Int, b: Int) => a + b
def sumMethod(a: Int, b: Int) = a + b

val c1 = a zip b map sumFunction.tupled
val c2 = a zip b map (sumMethod _).tupled

Использование .tupled не будет работать в первом случае, потому что Scala победил 'не сможет определить тип функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...