scala scalaz

scala - Cómo entender poligonal, traverseU y poligonal



scalaz (1)

sequence se usa para reunir los efectos aplicativos . Más concretamente, le permite "voltear" F[G[A]] a G[F[A]] , siempre que G sea Applicative y F sea Traversable . Entonces podemos usarlo para "juntar" un montón de efectos Applicative (note que todos los Monad son Applicative ):

List(Future.successful(1), Future.successful(2)).sequence : Future[List[Int]] // = Future.successful(List(1, 2)) List(4.set("abc"), 5.set("def")).sequence : Writer[String, List[Int]] // = List(4, 5).set("abcdef")

traverse es equivalente al map luego a la sequence , por lo que puede usarlo cuando tiene una función que devuelve un Applicative y desea obtener solo una instancia de su Applicative lugar de una lista de ellos:

def fetchPost(postId: Int): Future[String] //Fetch each post, but we only want an overall `Future`, not a `List[Future]` List(1, 2).traverse[Future, String](fetchPost): Future[List[String]]

traverseU es la misma operación que traverse , solo con los tipos expresados ​​de forma diferente para que el compilador pueda inferirlos más fácilmente.

def logConversion(s: String): Writer[Vector[String], Int] = s.toInt.set(Vector(s"Converted $s")) List("4", "5").traverseU(logConversion): Writer[Vector[String], List[Int]] // = List("4", "5").map(logConversion).sequence // = List(4.set("Converted 4"), 5.set("Converted 5")).sequence // = List(4, 5).set(Vector("Converted 4", "Converted 5"))

traverseM(f) es equivalente a traverse(f).map(_.join) , donde join es el nombre de scalaz para flatten . Es útil como una especie de "elevación de FlatMap":

def multiples(i: Int): Future[List[Int]] = Future.successful(List(i, i * 2, i * 3)) List(1, 10).map(multiples): List[Future[List[Int]]] //hard to work with List(1, 10).traverseM(multiples): Future[List[Int]] // = List(1, 10).traverse(multiples).map(_.flatten) // = List(1, 10).map(multiples).sequence.map(_.flatten) // = List(Future.successful(List(1, 2, 3)), Future.successful(List(10, 20, 30))) // .sequence.map(_.flatten) // = Future.successful(List(List(1, 2, 3), List(10, 20, 30))).map(_.flatten) // = Future.successful(List(1, 2, 3, 10, 20, 30))

Estoy confundido sobre el caso de uso sobre poligonal, traverseU y poligonal, lo busqué en el sitio web de Scalaz, el ejemplo de código simple:

def sum(x: Int) = x + 1 List(1,2,3).traverseU(sum)

parece que es similar a (mapa y agregado):

List(1,2,3).map(sum).reduceLeft(_ + _)

Creo que es más que eso para TraverseU, solo me pregunto cuál es la diferencia entre esos 3 métodos, sería mejor que tenga algún código de muestra para mostrar la diferencia

Muchas gracias de antemano