首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >L型在A型=>中也处于相反位置[L,B]

L型在A型=>中也处于相反位置[L,B]
EN

Stack Overflow用户
提问于 2018-08-27 13:23:23
回答 1查看 205关注 0票数 1

我试着编写flatMap的简单实现

代码语言:javascript
复制
sealed trait Either[+L, +R] {
  def flatMap[B](f: R => Either[L, B]): Either[L, B] = this match {
    case Left(e) => Left(e)
    case Right(e) => f(e)
  }
}

final case class Right[+A, +B](right: B) extends Either[A, B]
final case class Left[+A, +B](left: A) extends Either[A, B]

并面临以下问题:协变型L在f型中处于相对位置:r => EitherL,B值f,但为什么如此?当我们以变量类型作为函数的参数时,我认为我们的类型处于相反的位置,它与类型声明无关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-27 13:35:54

您可以将R => Either[L, B]看作是“L类型的广义值”--它与L并不完全相同,但如果是R,则可能会生成L。因此,您的flatMap“使用L类型的广义值”。同时,您的方差声明声称Either[+L, +R]L中是协变的,因此,Either[VerySpecial, R]必须是Either[RatherGeneral, R]的特例。但这是不可能的,因为只能使用VerySpecial值的VerySpecial会阻塞RatherGeneral输入。

  • Either[+L, +R]中,L处于协变位置(至少有时是"produces" Ls )。
  • R => Either[L, B]中,L仍然处于协变位置(因为函数生成Either[L, B],而Either[L, B]反过来生成L,所以整个事物都生成Ls)。
  • (R => Either[L, B]) => Either[L, B]中,第一个L出现在contra_variant位置,因为参数部分是方法flatMap的_consumed。

这很容易用标准的下类型界技巧来修正:

代码语言:javascript
复制
sealed trait Either[+L, +R] {
  def flatMap[B, M >: L](f: R => Either[M, B]): Either[M, B] = this match {
    case Left(e) => Left(e)
    case Right(e) => f(e)
  }
}

final case class Right[+A, +B](right: B) extends Either[A, B]
final case class Left[+A, +B](left: A) extends Either[A, B]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52040427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档