HList と派生 HList を返す方法を知っている型クラスを作成したいと思います。理想的には、次のような構造になります。
trait Axis[A, L1 <: HList] {
type L2 <: Mapped[L1,Ordering]#Out
def vectorize(a:A): L1
def orderings: L2
}
そして次のように実装されます
implicit object Tup2DI extends Axis[(Double, Int), Double :: Int :: HNil] {
val m = implicitly[Mapped[Double :: Int :: HNil, Ordering]]
type L2 = m.Out
def vectorize(a: (Doubble, Int)) = a._1 :: a._2 :: HNil
def orderings = implicitly[Ordering[Double]] :: implicitly[Ordering[Int]] :: HNil
}
問題は、型を特定するのに十分な情報があるにもかかわらず、scala が型を具体化していないため、コンパイル中に、次のエラーが発生することです。
found : shapeless.::[Ordering[Double],shapeless.::[Ordering[Int],shapeless.HNil]]
required: Tup2DI.L2
(which expands to) Tup2DI.m.Out
def orderings:L2 = implicitly[Ordering[Double]] :: implicitly[Ordering[Int]] :: HNil
関心のある情報を正しくコンパイルする方法で表現するにはどうすればよいですか?