Wykorzystaliśmy transformator Monadera WriterT na platformie Futures, mając nadzieję na bardziej zorganizowane logi z aplikacji asynchronicznej, ale mieliśmy pewne problemy.Scalaz: jaką rolę odgrywa filtr w | @ |?
Jeśli skompiluję aplikację poniżej, pojawia się następujący błąd. Należy pamiętać, że nie jest to ostrzeżenie o filtrze withFilter.
[Błąd] Filtr wartość nie jest członkiem scalaz.WriterT [scala.concurrent.Future, List [ciąg], String]
Dlaczego | @ | potrzebujesz filtra tutaj? Czy Scalaz zapewnia niejawną konwersję dla tej sprawy?
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) }
}
Błąd występuje w wersji Scala: 2.11.7 i Scalaz wersja: 7.2.0
Dodałem adnotację typu, aby pomóc typowi IntelliJ sprawdzić kod. Nigdy bym nie przypuszczał, że to może być szkodliwe. –