私はHList
を使用して、同じ親を共有するオブジェクトのコレクションをモデル化しようとしています。 シェイプレスHMapの要素を変更した後に型を保持
親に定義されたメソッドを使用して、コレクションの特定の要素を変換し、インデックスを使用して、コレクションの
- アクセス要素:私のことができるようにしたいと思います上のポイント(方法
withIndex
の下)。ただし、IntelliJ IDEAは、メッセージExpression of type at.Out doesn't conform to expected type T
で強調表示エラーを表示します。これを取り除くために追加できる暗黙のことはありますか?第二の点(方法下記
modify
)のために、私はコンパイルエラーError:(31, 13) type mismatch; found : result.type (with underlying type Value) required: T result
を取得するには、私が
asInstanceOf
キャストを取り除くために追加できるという暗黙のは、私が適用できるように、ありますmodify
方法?また、modify
メソッドを適用しても、同じタイプのオブジェクトを取得できるようにしたいと考えています。表示されるように、Additive
とMultiplicative
は、modify
メソッドを正しく実装しています。私は...これは本当にケースであるという証拠を提供する方法を見つけるのに苦労しています。これは、上記のコードは、参照:
import shapeless._ import shapeless.ops.hlist.At sealed trait Value { val value: Double def modify(newValue: Double): Value } case class Additive(value: Double) extends Value { def modify(newValue: Double): Additive = this.copy(value = value + newValue) } case class Multiplicative(value: Double) extends Value { def modify(newValue: Double): Multiplicative = this.copy(value = value * newValue) } case class Collection[L <: HList](values: L) (implicit val ev: LUBConstraint[L, Value]) { def withIndex[T <: Value](index: Nat)(implicit at: At.Aux[L, index.N, T]): T = values(index) def modify[T <: Value](index: Nat, newValue: Double)(implicit at: At.Aux[L, index.N, T]): T = { val value = values(index) val result = value.asInstanceOf[T].modify(newValue) result } } object App { def main(args: Array[String]): Unit = { val val1 = Additive(1.0) val val2 = Additive(2.0) val val3 = Multiplicative(3.0) val coll = Collection(val1 :: val2 :: val3 :: HNil) val copyVal1: Additive = coll.withIndex(0) val copyVal2: Additive = coll.withIndex(1) val copyVal3: Multiplicative = coll.withIndex(2) coll.modify(0, 1.0) coll.modify(1, 2.0) coll.modify(2, 3.0) } }
最初の点については、IntelliJ Ideaの奇妙な点でしょうか? 2番目の点については、この記事を参照してください:http://stackoverflow.com/questions/4313139/how-to-use-scalas-this-typing-abstract-types-etc-to-implement-a-self-type – devkat
@devkatの提案では、 'Value''型の' self ::
sm01