协变类型出现在 HList 中不变的位置
covariant type occurs in invariant position in HList
我正在尝试定义一个类型安全的异构列表,它对其元素的类型有限制,在元素之间强制执行层次结构(例如,类型 A 不能出现在类型 B 之后)。尝试将我的结构转换为无形状的 HList 时出现问题。
以下是我如何定义我的类型的特征:
sealed trait Hierarchy {
type HListType <: HList
def toHList : HListType
def toCaseClass[C](implicit gen: Generic[C]{type Repr >: HListType}) = gen.from(toHList)
}
sealed trait <::[+H <: ElType[_], +T <: Hierarchy] extends Hierarchy {
override type HListType = H :: tail.HListType
val head: H
val tail: T
override def toHList: HListType = head :: tail.toHList
}
我收到以下错误:
Hierarchy.scala:26: covariant type H occurs in invariant position in type shapeless.::[H,<::.this.tail.HListType] of type HListType
这很令人费解,因为 shapeless.::
的定义定义了两个类型参数都是协变的。
我正在使用 scala 2.11.11 和 shapeless 2.3.2。有没有办法修复这个错误?
来自 Scala 规范:
The right-hand side of a type alias is always in invariant position.
所以问题不在于 HList 的定义,而在于我在类型别名中使用了类型参数。
我把定义改成了
sealed trait <::[+H, +T <: Hierarchy] extends Hierarchy {
type H_ <: ElType[H]
override type HListType = H_ :: tail.HListType
val head: H_
val tail: T
override def toHList: HListType = head :: tail.toHList
}
问题消失了。
我正在尝试定义一个类型安全的异构列表,它对其元素的类型有限制,在元素之间强制执行层次结构(例如,类型 A 不能出现在类型 B 之后)。尝试将我的结构转换为无形状的 HList 时出现问题。
以下是我如何定义我的类型的特征:
sealed trait Hierarchy {
type HListType <: HList
def toHList : HListType
def toCaseClass[C](implicit gen: Generic[C]{type Repr >: HListType}) = gen.from(toHList)
}
sealed trait <::[+H <: ElType[_], +T <: Hierarchy] extends Hierarchy {
override type HListType = H :: tail.HListType
val head: H
val tail: T
override def toHList: HListType = head :: tail.toHList
}
我收到以下错误:
Hierarchy.scala:26: covariant type H occurs in invariant position in type shapeless.::[H,<::.this.tail.HListType] of type HListType
这很令人费解,因为 shapeless.::
的定义定义了两个类型参数都是协变的。
我正在使用 scala 2.11.11 和 shapeless 2.3.2。有没有办法修复这个错误?
来自 Scala 规范:
The right-hand side of a type alias is always in invariant position.
所以问题不在于 HList 的定义,而在于我在类型别名中使用了类型参数。
我把定义改成了
sealed trait <::[+H, +T <: Hierarchy] extends Hierarchy {
type H_ <: ElType[H]
override type HListType = H_ :: tail.HListType
val head: H_
val tail: T
override def toHList: HListType = head :: tail.toHList
}
问题消失了。