2017-08-03 8 views
0

要素の種類に制限を持つタイプセーフな異種リストを定義しようとしています(たとえば、タイプAの後にタイプAが出現できないなど)。私の構造を無形のHListに変換しようとすると、問題が発生します。私は次のエラーを取得する共変タイプが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のスペックから

答えて

0

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 

} 

に定義を変更し、問題が消えます。

関連する問題