Scala лямбда-функция с функцией отображения

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

val x = Массив (( 3 , 2 ), ( 4 , 5 )) prettyprinted ">  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))

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

scala,dictionary,lambda,functional-programming,

1

Ответов: 4


4

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

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

Поэтому вам нужно написать либо

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

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

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

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


0

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

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

scala> val tuple = (2,4)
tuple: (Int, Int) = (2,4)

scala> tuple._1
res11: Int = 2

scala> tuple._2
res12: Int = 4

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

И аналогичным образом вы создали массивы кортежей2.

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

0

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


0

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

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))
Скала, словарь, лямбда, функционально-программирование,
Похожие вопросы