Könnte mir jemand mit untenstehenden Codebits aus dem Buch helfen?Typ Projektionsbeispiel von "Scala in Action" (Kapitel 8)
trait Mapper[F[_]] {
def fmap[A, B](xs: F[A], f: A => B): F[B]
}
def VectorMapper = new Mapper[Vector] {
def fmap[A, B](xs: Vector[A], f: A => B): Vector[B] = xs map f
}
so einfach war: Charakterzug Definition höheren kinded Typen F[_]
für die Verwendung mit irgendwelchen „containerartigen“ Typen verwendet, dann einen konkreten Mapper für Vector
.
Dann geht ein kniffliger Teil. Mapper für Either
. Ich verstehe {type E[A] = Either[X, A]}
nur als ein Block des Codes und ({type E[A] = Either[X, A]})#E
als eine Projektion, die diesen Typ Alias E
aus dem anonymen Block des Codes und von diesem Autor "verbirgt" die Anwesenheit von X
für die Eigenschaft, weil Merkmal auf einzelnen Typ funktioniert Parameter "Containertypen" nur - und wir sind interessiert an A
, dh Right
.
def EitherMapper[X] = new Mapper[({type E[A] = Either[X, A]})#E ] {
def fmap[A, B](r: Either[X, A], f: A => B): Either[X, B] = r match {
case Left(a) => Left(a)
case Right(a) => Right(f(a))
}
}
Frage: Warum brauchen wir X
im def EitherMapper[X] =
Teil?
Danke für Details.
Vincenzo, hi. Könnten Sie bitte die Verwendung des "Entweder-Mappers" illustrieren, könnte dies klarer werden? Ich frage das, weil, sagen wir, für 'VectorMapper' ist es einfach wie 'val v = VectorMapper.fmap (einigeVectorOfInts, _ => _ * 2)' – Max
Ja, warte nur ein wenig, weil ich meine nehmen muss Laptop, wo ich Scala –
installiert habe Beispiel hinzugefügt !!! –