以下代码
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。任何帮助将不胜感激!
答案 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]
}