功能差异

来宝
sealed trait Sum[+A, +B] {
  def flatMap[A, C](f: B => Sum[A, C]): Sum[A, C] =
    this match {
      case Failure(v) => Failure(v)
      case Success(v) => f(v)
    }
} 

难道不是说函数参数是反变量而结果是协变量吗?为什么编译器会说A处于反变量位置?我期望编译器抱怨B处于反变量位置。

有人可以向我解释为什么会这样吗?感觉一头雾水。

高温超净水

我假设您实际上打算写:

sealed trait Sum[+A, +B] {
  def flatMap[C](f: B => Sum[A, C]): Sum[A, C] = // No shadowing of A
    this match {
      case Failure(v) => Failure(v)
      case Success(v) => f(v)
    }
}

flatMap看一看

def flatMap[C](f: B => Sum[A, C]): Sum[A, C]

让我们重写一下:

def flatMap[C]: (B => Sum[A, C]) => Sum[A, C]

让我们从内而外地构建类型。

Sum[A, C]

A是的参数Sum,通常是协变位置。

B => Sum[A, C]

Sum[A, C]是函数的结果,通常是协变位置。这两个结合在一起,您仍然A处于协变位置。

(B => Sum[A, C]) => Sum[A, C]

B => Sum[A, C]也是函数参数,因此整个事物处于不变位置。由于A以前处于协变位置,所以方差合并并且A现在处于协变位置。

B

B => Sum[A, C]

函数的参数,通常是一个反位置。

(B => Sum[A, C]) => Sum[B, C]

整个函数也是另一个函数的参数,因此矛盾消除并且B处于协变位置。

您还可以得出一个漂亮的类比。查看协变量和逆变量类型参数的定义:

trait Co[+A]; trait Con[-A]

它们看起来像正数和负数,仅此而已。现在,请记住您在小学阶段学到的乘法规则和符号:

  • (+) * (+) = (+)
  • (+) * (-) = (-)
  • (-) * (+) = (-)
  • (-) * (-) = (+)

这类似于(如果您斜视一下)

  • Co[Co[A]]=>A处于协变位置
  • Co[Con[A]]=>A处于反位置
  • Con[Co[A]]=>A处于反位置
  • Con[Con[A]]=>A处于协变位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

GHCi与runhaskell在getLine功能上的差异

来自分类Dev

GHCi与Runhaskell在getLine功能上的差异

来自分类Dev

功能产生错误的差异

来自分类Dev

澄清方法/功能差异

来自分类Dev

反向差异功能

来自分类Dev

删除IDoc的功能模块

来自分类Dev

Label和TextBlock之间的文化差异

来自分类Dev

有实例中的变量定义中getInstance()方法初始化单之间的功能性差异,或

来自分类Dev

R中的“累积差异”功能

来自分类Dev

Excel改善日期差异功能

来自分类Dev

文件复制与名称功能?差异?

来自分类Dev

卡在功能上

来自分类Dev

功能/功能表的指针

来自分类Dev

功能模块未导出组件

来自分类Dev

这是加密功能强大的Guid吗?

来自分类Dev

功能模块中的可选参数?

来自分类Dev

如何根据需求或功能设计类

来自分类Dev

Android动态功能模块依赖项

来自分类Dev

未安装动态功能模块

来自分类Dev

在功能模块中声明组件

来自分类Dev

SLI桥接器与功能强大的GPU?

来自分类Dev

功能模块中的可选参数?

来自分类Dev

主页上的Opencart多功能模块

来自分类Dev

批量处理功能模块接口?

来自分类Dev

功能模块(TypeScript)的声明文件

来自分类Dev

功能模块中的 Angular 2 路由

来自分类Dev

功能模块作为 Angular 中的库?

来自分类Dev

与Perfecto Appium功能相比,会话功能与本地功能的差异

来自分类Dev

在类型级别的功能上可以进行模式匹配,但在值级别上却不能,为什么会有这种差异?