例如,您可以定义一个Poly。
import shapeless.Poly1
object myPoly extends Poly1 {
implicit val aCase: Case.Aux[A, Basic with A] = at(_ => new Basic() with A)
implicit val bCase: Case.Aux[B, Basic with B] = at(_ => new Basic() with B)
}
myPoly(new A {})
myPoly(new B {})
我猜HList 在这里无关紧要,因为Generic 将Type 转换为副产品而不是HList。
import shapeless.{:+:, CNil, Generic}
sealed trait Type
case class A() extends Type
case class B() extends Type
implicitly[Generic.Aux[Type, A :+: B :+: CNil]]
您可以使用Poly 和singleton types:
import shapeless.{Poly1, Witness}
import shapeless.syntax.singleton._
sealed trait Type
trait A extends Type
trait B extends Type
case class Basic(int: Int, bool: Boolean)
val someInt: Int = 2
val someBool: Boolean = false
val someType: String = "a"
object myPoly extends Poly1 {
implicit val aCase: Case.Aux[Witness.`"a"`.T, Basic with A] = at(_ => new Basic(someInt, someBool) with A)
implicit val bCase: Case.Aux[Witness.`"b"`.T, Basic with B] = at(_ => new Basic(someInt, someBool) with B)
}
myPoly("a".narrow)
myPoly("b".narrow)
// myPoly("c".narrow) // doesn't compile