#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 да, эта ошибка не имеет к этому никакого отношения, это просто ошибка где-то в вашем коде.