我尝试了以下方法:
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] {}
}
仅当所有元素都与类型类匹配时,这才为我提供了隐含的证据。
但是,当试图像这样使用它时(一个人为的例子):
def transform[A](a: A)(implicit ev: Evidence[A :: HNil, Ordering]) =
{ List(a,a).sorted }
这给出了错误
error: No implicit Ordering defined for A.
根据
Evidence[A :: HNil, Ordering]
的存在应该在那里 最佳答案
您不需要定义自己的Evidence
类型类。使用shapeless的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
}
关于scala - 如何获得证明Shapeless HList中的每个类型元素都属于一个类型类的证据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33622971/