Подтвердить что ты не робот

Как вызвать .map() в списке пар в scala?

Я хочу вызвать map() в списке пар, но я получаю ошибку несоответствия типа.
Например, предположим, что я хочу отобразить список пар Int в список их сумм:

scala> val ll=List((1,2),(3,4),(5,6))
ll: List[(Int, Int)] = List((1,2), (3,4), (5,6))

scala> ll.map((x:Int,y:Int)=>x+y)
<console>:9: error: type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ?
              ll.map((x:Int,y:Int)=>x+y)
                                  ^

Кстати, при попытке запустить foreach() я получаю очень похожую ошибку.

scala> ll.foreach((x:Int,y:Int)=>println(x,y))
<console>:9: error: type mismatch;
 found   : (Int, Int) => Unit
 required: ((Int, Int)) => ?
              ll.foreach((x:Int,y:Int)=>println(x,y))
                                  ^

Что делает? подписать стенд? Что мне здесь не хватает?

спасибо

4b9b3361

Ответ 1

Вы можете использовать соответствие шаблону, чтобы получить элементы пары.

ll.map{ case (x:Int,y:Int) => x + y }

Вам даже не нужно указывать типы:

ll.map{ case (x, y) => x + y }

То же самое работает с foreach, конечно.

Сообщение об ошибке сообщает вам, что компилятор должен найти функцию одного параметра (пару целых чисел) любому типу (вопросительный знак) и вместо этого найти функцию из двух параметров, как ints.

Ответ 2

Вы можете использовать:

ll.map(x => x._1 + x._2)

где x означает сам кортеж, или

ll.map(x:(Int,Int) => x._1 + x._2)

если вы хотите явно объявить типы.

Ответ 3

Вы можете комбинировать функцию, что означает переход от одного, который принимает N args к одному, который принимает 1 arg, который является N-кортежем. Функция более высокого порядка для этого доступна в объекте Function. Это приводит к хорошему синтаксису плюс дополнительная безопасность типов, выделенная в комментариях к ответу Брайана Агнью.

import Function.tupled

ll map tupled(_ + _)

Ответ 4

Обратите внимание, что в Dotty (основа Scala 3) расширение параметров было расширено, что позволило использовать следующий синтаксис:

List((1, 2), (3, 4), (5, 6)).map(_ + _)
// List(3, 7, 11)

где каждый _ относится к связанной части кортежа.