Abbiamo utilizzato il trasformatore monad WriterT su Futures sperando di ottenere registri più organizzati da un'applicazione asincrona, ma abbiamo incontrato dei problemi.Scalaz: che ruolo gioca il filtro in | @ |?
Se compilo l'applicazione di seguito, ottengo il seguente errore. Si prega di notare che questo non è l'avviso su withFilter.
[errore] Filtro valore non è un membro del scalaz.WriterT [scala.concurrent.Future, List [String], String]
Perché | @ | bisogno di filtro qui? Scalaz fornisce una conversione implicita per questo caso?
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scalaz._
import Scalaz._
object Failure extends App {
type LoggedT[F[_], A] = WriterT[F, List[String], A]
type LoggedFuture[A] = LoggedT[Future, A]
//this is the applicative behavior that we want WriterT to preserve
val example = for {
z <- (Future("left") |@| Future("right")) { (x: String, y: String) => x + " " + y }
} yield z
example.onSuccess { case x => println(x) }
val test = for {
z: String <- (Future("left").liftM[LoggedT] |@| Future("right").liftM[LoggedT]) { (x: String, y: String) => x + " " + y }
} yield z
test.value.onSuccess { case x => println(x) }
}
L'errore si verifica con la versione Scala: 2.11.7 e Scalaz versione: 7.2.0
Ho aggiunto l'annotazione del tipo solo per aiutare il tipo IntelliJ a controllare il codice. Non avrei mai immaginato che potesse essere così dannoso. –