Czy ktoś mógłby mi pomóc z poniższymi fragmentami kodu z książki?Przykładowy przykład projekcji z "Scala w akcji" (rozdział 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
}
To było proste: określenie cechą zastosowania wyższej-kinded typu F[_]
do zastosowania wszelkich typów „pojemnik” podobne, a następnie beton mapowania dla Vector
.
Potem idzie trudna część. Mapper dla Either
. Rozumiem, że {type E[A] = Either[X, A]}
jako blok kodu i ({type E[A] = Either[X, A]})#E
jako odwzorowanie tego typu aliasu E
z anonimowego bloku kodu i przez tego autora "ukrywa" obecność X
dla cechy Mapper
, ponieważ cecha działa na jednym typie Parametr "typy kontenerów" - i jesteśmy zainteresowani A
, tj. 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))
}
}
Pytanie: Dlaczego potrzebujemy X
w def EitherMapper[X] =
części?
Dzięki za szczegóły.
Vincenzo, cześć. Czy mógłbyś z przyjemnością zilustrować użycie 'EitherMapper', może to uczyniłoby to jaśniejszym? Pytam o to, ponieważ, powiedzmy, dla 'VectorMapper' jest to proste jak' val v = VectorMapper.fmap (someVectorOfInts, _ => _ * 2) ' – Max
Tak, po prostu poczekaj chwilę, bo muszę wziąć mój laptop, w którym zainstalowałem Scala –
Dodano przykład !!! –