Не удивительно, что Scala не может вывести W
при W#T
, потому что, вообще говоря, два разных W
могут иметь одинаковые W#T
. Не для типов-свидетелей, но они не обрабатываются специально компилятором.
То, что я ожидал работать (и не уверен, почему это не так), это указать параметр типа:
KN[Witness.`1`](1)
// error: type arguments [scala.this.Any] do not conform to method apply's type parameter bounds [W <: shapeless.this.Witness.Lt[scala.this.Int]]
или более вероятно
KN[w1.type](1)
// error: type mismatch;
// found : scala.this.Int(1)
// required: .this.T
Что работает:
case class KN[W <: Witness.Lt[Int]](w: W) extends KnownAxis[W] {
val n = w.value
}
KN(Witness(1))
Кажется, это соответствует требованиям в вашем вопросе, но я не знаю, будет ли это работать с остальная часть вашего кода.
Вы также можете рассмотреть эту альтернативу, которая не требует Shapeless в Scala 2.13:
trait Axis extends Serializable
case object UnknownAxis extends Axis
trait KnownAxis[W <: Int with Singleton] extends Axis {
def n: W
def ++(that: KnownAxis[W]): Unit = {}
}
case class KN[W <: Int with Singleton](n: W) extends KnownAxis[W]
KN(1)
Для 2.12
import shapeless.syntax.singleton._
...
KN(1.narrow)