任何人都可以帮助我解决书中的以下代码位吗?
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
}
这很简单:特征定义使用更高种类F[_]
的类型与任何“容器类”类型一起使用,然后是Vector
.
然后是一个棘手的部分。映射器为Either
. 我将其理解{type E[A] = Either[X, A]}
为代码块,以及({type E[A] = Either[X, A]})#E
将类型别名E
从匿名代码块中取出的投影,并且该作者“隐藏”了特征的存在,X
因为Mapper
特征仅对单个类型参数“容器类型”进行操作- 我们感兴趣的是A
,即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))
}
}
问题:
为什么我们需要X
在def EitherMapper[X] =
零件?
感谢您提供详细信息。