Как вызвать .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))
^
Что делает? подписать стенд? Что мне здесь не хватает?
спасибо
Ответы
Ответ 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)
где каждый _
относится к связанной части кортежа.