Как указать аргументы функции, передаваемой функции карты Scala (более высокого порядка)?

#scala #functional-programming #higher-order-functions

Вопрос:

У меня есть функция f, которая принимает два аргумента — a:Int и b:Int

f (a:Int, b:Int): Int

Я хочу вызвать карту в списке из 2-х кортежей — так,чтобы для каждого кортежа (a, b) в списке я хотел сопоставить его с f(a,b). Как я это сделаю ? Спасибо

Ответ №1:

Есть два способа сделать это.

Во-первых, и, возможно, наиболее ясно для читателей, вы можете уничтожить кортеж в map :

 val tuples: List[(Int, Int)] = ???  // code to generate the list
tuples.map {
  case (a, b) => f(a, b)
}
 

Во-вторых, вы можете преобразовать функцию в функцию, которая принимает кортеж в качестве входных .tupled данных . Методы, определенные с def помощью, должны быть сначала превращены в функцию:

 val tupledF = (f _).tupled
val tuples: List[(Int, Int)] = ??? // code to generate the list
tuples.map(tupledF)
 

Комментарии:

1. Спасибо, я получаю следующую ошибку -> « scala>> val seq_xs = (Seq.заполнение(степень)(x)).zipWithIndex.map((exp _).кортеж) java.lang. Исключение UnsupportedOperationException: пустой.reduceLeft в scala.collection. LinearSeqOptimized.reduceLeft(LinearSeqOptimized.scala:139) в scala.collection. LinearSeqOptimized.reduceLeft$(LinearSeqOptimized.scala:138) в scala.collection «

2. @BhawandeepSingh эта ошибка не имеет никакого отношения к вашему вопросу. Вы просто вызываете reduceLeft где-то пустую последовательность.

3. Спасибо, это было неудачно для случая, когда степень равна 0.

Ответ №2:

Ты можешь просто сделать l.map { case (a,b) => f(a,b) } . Или хитрый способ: l.map((f _).tupled)

Комментарии:

1. Спасибо, я получаю ошибку с обоими. Первый -> > scala> val seq_xs = (Seq.fill(degree)(x)).zipWithIndex.map { (a,b) => exp(a,b) } <console>:14: error: type mismatch; found : (Int, Int) => Int required: ((Int, Int)) => ? val seq_xs = (Seq.fill(degree)(x)).zipWithIndex.map { (a,b) => exp(a,b) } .

2. 2-й -> « scala>> val seq_xs = (Seq.fill(степень)(x)).zipWithIndex.map(exp.кортеж) >><консоль>:14: ошибка: список отсутствующих аргументов для метода exp Неприменимые методы преобразуются в функции только тогда, когда ожидается тип функции. Вы можете сделать это преобразование явным, написав exp _ или exp(_,_) вместо exp . val seq_xs = (Seq.заполнение(степень)(x)). zipWithIndex.карта(exp.кортеж) «

3. @BhawandeepSingh упс. Исправил это. Попробуй сейчас .

4. @BhawandeepSingh да, эта ошибка не имеет к этому никакого отношения, это просто ошибка где-то в вашем коде.