加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从“Scala in Action”中输入投影示例(第8章)

发布时间:2020-12-16 18:38:35 所属栏目:安全 来源:网络整理
导读:任何人都可以帮助我从书中下面的代码位? 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 [_]的特征定义
任何人都可以帮助我从书中下面的代码位?

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.
我理解{类型E [A] = [X,A]}只是作为一个代码块,并且({类型E [A] = [X,A]})#E作为采用该类型别名的投影E出于匿名代码块,并由该作者“隐藏”X对Mapper特征的存在,因为trait仅对单一类型参数“容器类型”进行操作 – 我们对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))
    }     
}

题:
为什么我们在def EitherMapper [X] =部分需要X?

谢谢你的详细信息

解决方法

要么取决于两种类型,例如[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”部分.

希望现在更清楚了!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读