Scala 2.12中的协方差和更高级的类型

时间:2017-10-26 13:05:09

标签: scala covariance higher-kinded-types type-alias

以下代码

type Id[+A] = A
type ReprF[A, F[_]] = Unit
type Repr[A] = ReprF[A, Id]

无法在Scala 2.12中编译,错误

covariant type Id occurs in invariant position in type 
[A]Playground.this.ReprF[A,Playground.this.Id] of type Repr

我不明白为什么Id的协方差阻止了这段代码的编译。

ReprF不应该关心F是否有协变性,它只需要一种* -> *类型。

我错过了什么吗?

奇怪的是,它在Scala 2.11中正确编译。

如果您想对代码稍微玩一下,这是scastie snippet。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我认为编译器对协变ID非常困惑。即使所有都是协变的,它仍会给出相同的错误:

trait Test {
  type Id[+A] = A
  type ReprF[+A, +F[+_]] = Unit
  type Repr[+A] = ReprF[A, Id]
}

Error: covariant type Id occurs in invariant position in type [+A]Test.this.ReprF[A,Test.this.Id] of type Repr
  type Repr[+A] = ReprF[A, Id]

如果我保留ID未定义,那很好:

trait Test {
  type Id[+A]
  type ReprF[A, F[_]] = Unit
  type Repr[A] = ReprF[A, Id]
}