Scala 如何获得无形状HList中的每个类型元素都属于一个typeclass的证据

Scala 如何获得无形状HList中的每个类型元素都属于一个typeclass的证据,scala,shapeless,Scala,Shapeless,我尝试了以下方法: trait Evidence[H <: HList, T[_]] {} object Evidence { implicit def HNilEvidence[T[_]] = new Evidence[HNil, T] {} implicit def HListEvidence[Head, Remaining <: HList, T[_]](implicit headEv: T[Head], remainingEv: Evidence[Remaining

我尝试了以下方法:

trait Evidence[H <: HList, T[_]] {}

object Evidence {
  implicit def HNilEvidence[T[_]] = new Evidence[HNil, T] {}
  implicit def HListEvidence[Head, Remaining <: HList, T[_]](implicit headEv: T[Head], remainingEv: Evidence[Remaining, T]) =
    new Evidence[Head :: Remaining, T] {}
}
这就产生了错误

error: No implicit Ordering defined for A.

基于证据的存在[A::HNil,排序]

为什么不使用
LUB
表示列表的内容,并简单地将排序证据的请求移动到方法级别?这里的typeclass位有误导性,您匹配的似乎是
类型
,除非我缺少明显的,而不是类型类或类型族

由于这个原因,
LUBConstraint
已存在于Shapeless中

class Transformer[HL <: HList, T](list: T :: HL)(
  implicit val c: LUBConstraint[HL, T]
) {
  def transform(obj: List[T])(
    implicit ev: Ordering[T],
    toList: ToList[T :: HL, T]
  ): List[T] = (toList(list) ::: obj).sorted(ev.reverse)
}

您不需要定义自己的
证据
类型类。使用不成形的'
ops.hlist.LiftAll

def transform[A](a: A)(implicit
                                     liftAll: LiftAll.Aux[Ordering, A :: HNil, Ordering[A] :: HNil],
                                     isHCons: IsHCons.Aux[Ordering[A] :: HNil, Ordering[A], HNil]): List[A] = {
  implicit val ordering: Ordering[A] = liftAll.instances.head
  List(a, a).sorted
}

实际上不需要隐式证据
isHCons
,因为它可用于任何cons列表,而
Ordering[A]::HNil
已经存在。
val list = "test3" :: "test1" :: "test2" :: HNil
val listb = List("test5", "test4", "test6")
val transformer = new Transformer(list)

transformer.transform(listb) shouldEqual List(
  "test6",
  "test5",
  "test4",
  "test3",
  "test2",
  "test1"
)
def transform[A](a: A)(implicit
                                     liftAll: LiftAll.Aux[Ordering, A :: HNil, Ordering[A] :: HNil],
                                     isHCons: IsHCons.Aux[Ordering[A] :: HNil, Ordering[A], HNil]): List[A] = {
  implicit val ordering: Ordering[A] = liftAll.instances.head
  List(a, a).sorted
}