从“Scala in Action”中输入投影示例(第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 } 这很简单:使用高级类型F [_]的特征定义用于任何“容器类”类型,然后是Vector的具体映射器. 然后是一个棘手的部分. Mapper for Either. 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)) } } 题: 谢谢你的详细信息 解决方法
要么取决于两种类型,例如[Int,String]
EitherMapper是一个只依赖于一种类型的类型构造函数,所以当你有一个EitherMapper [Int]时,你正在处理一个Either [Int,并且A被解析为Mapper部分,这样你就可以拥有A => B函数,因为第一种类型的Either已经存在于Mapper中,并且您返回Either [X,B]. 事实上,E [A]类型相当于[X,你对类型只有一个自由度! val right: Either[Boolean,String] = Right("test") val left: Either[Boolean,String] = Left(false) println(EitherMapper.fmap(right,(s: String) => s.length)) > Right(4) println(EitherMapper.fmap(left,(s: String) => s.length)) > Left(false) 在这种情况下,类型是EitherMapper [Boolean],fmap的类型是fmap [String,Integer],它接受Either [Boolean,String]并返回Either [Boolean,Integer]. 正如你所看到的那样,fmap的类型在Either [X,A]类型的X部分没有说什么,所以最后你可以使用(s:String)=> s.length)其他人的函数EitherMapper [X]类型,简单来说,任何一种类型的“左”部分都可以是你想要的任何东西,它是类型结构的“X”部分. 希望现在更清楚了! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |