Сокращение для уменьшения перемещения по карте

#scala #functional-programming #scala-cats

#scala #функциональное программирование #scala-кошки

Вопрос:

Я ищу короткий способ обхода и уменьшения одновременно. Вот решение, которое я придумал:

 import cats.{Applicative, Monad}
import cats.instances.list._
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.traverse._

object Test extends App {
  def intFM[F[_], M[_]](i: Int): F[M[Int]] = ???

  def traverseReduce[F[_]: Applicative, M[_]: Monad](lst: List[Int]) =
    lst.traverse(intFM[F, M]).map(_.reduce(_ >> _))
}
  

Как видно, я выполнил 3 операции: traverse , map и reduce , но я ожидал, что сокращение можно выполнить во время обхода. Есть ли какое-то сокращение?

Ответ №1:

Вы можете попробовать без обхода

 def traverseReduce[F[_]: Applicative, M[_]: Monad](lst: List[Int]): F[M[Int]] =
  lst.map(intFM[F, M]).reduce((_, _).mapN(_ >> _))