Функция Scala lambda с функцией отображения

Shikha спросил: 13 июня 2018 в 07:43 в: scala

Я определяю следующую переменную x

val x = Array((3,2), (4,5))

Его тип Array[(Int, Int)]

Когда я делаю следующее:

x.map((a: Int, b: Int) => "(" + a + ", " + b + ")")

Я получаю следующую ошибку:

console:28: error: type mismatch;
found   : (Int, Int) => String
required: ((Int, Int)) => ?
             x.map((a: Int, b: Int) => "(" + a + ", " + b + ")")

Почему он ожидает, что тип первого элемента будет ((Int, Int))?

4 ответа

Alexey Romanov ответил: 13 июня 2018 в 08:05

(Int, Int) => ... - это тип функции с двумя аргументами, как Int (и это то, что всегда будет (a: Int, b: Int) => ...).

((Int, Int)) => ... - это тип функции с одним аргументом (Int, Int). map в Array требуется функция с одним аргументом, а для Array[(Int, Int)] тип этого аргумента должен быть (Int, Int).

Так что вам нужно написать либо

x.map(pair => "(" + pair._1 + ", " + pair._2 + ")")

, где pair имеет тип (Int, Int), или

x.map { case (a, b) => "(" + a + ", " + b + ")" }

(с использованием сопоставления с образцом). Обратите внимание, что в этом случае необходимы фигурные скобки.

Mahesh Chand Kandpal ответил: 13 июня 2018 в 02:38

Вы создали массив Tuple. Scala tuple объединяет фиксированное количество элементов вместе, чтобы их можно было передавать в целом. В отличие от массива или списка кортеж может содержать объекты с разными типами, но они также неизменяемы.

Чтобы получить доступ к значению кортежа, Scala предоставляет ._1, ._2 для доступа к значению кортежа. Например,

scala> val tuple = (2,4)
tuple: (Int, Int) = (2,4)scala> tuple._1
res11: Int = 2scala> tuple._2
res12: Int = 4

Если в кортеже имеется более двух значений, ._3 будет использовать для получения третьего значения кортежа.

p>

И аналогичным образом вы создали массивы tuple2.

scala> val arr = Array((1,1), (2,4), (3,9))
arr: Array[(Int, Int)] = Array((1,1), (2,4), (3,9))scala> arr.map(tuple => "(" + tuple._1 + "," + tuple._2 + ")" )
res13: Array[String] = Array((1,1), (2,4), (3,9))

Другой способ использования сопоставления шаблонов для получения значения.

scala> arr.map{
     | case (a: Int, b: Int) => "(" + a + "," + b + ")" }
res17: Array[String] = Array((1,1), (2,4), (3,9))
Arnon Rotem-Gal-Oz ответил: 13 июня 2018 в 04:03

Это небольшая неинтуитивная причуда Scala, что map(whatever=>...) то, что на самом деле одно - тип типа Seq, который вы просматриваете, который вы можете или нужно деконструировать позже. К счастью, как отмечали другие, вы можете использовать сопоставление образцов, и для этого вам нужно заменить скобки фигурными скобками и добавить ключевое слово case map {case (a,b) => } и т. Д.

RAGHHURAAMM ответил: 20 июня 2018 в 06:45

Причина ошибки уже дана Алексеем Романовым. и это также можно сделать так, если вы хотите использовать сопоставление с образцом:

x.map(v=>{val (a,b)=v;"(" + a + ", " + b + ")"})

В Scala REPL:

scala> val x = Array((3,2), (4,5))
x: Array[(Int, Int)] = Array((3,2), (4,5))scala> x.map(v=>{val (a,b)=v;"(" + a + ", " + b + ")"})
res2: Array[String] = Array((3, 2), (4, 5))

Дополнительное видео по вопросу: Функция Scala lambda с функцией отображения

Scala Tutorial - Function Literals

Scala Tutorial 21 - Scala Maps

Lambda Expression in Java 8