我的库中有一个用例,如果<{>}包含 HList A
的所有元素,则HList B
被视为可转换为HList B
订购。我需要在两者之间进行隐式转换,例如:
// implicit arguments omitted for readability
implicit def toOther[A <: HList, B <: HList](l: A): B = l.filter[B].align[B]
但HList.filter
如果提供类型为HList的类型参数,则返回HNil
。我怎么能把A转换为B?
修改
这是尝试实现功能如果您需要复制和粘贴样板:
import shapeless.{::, HList, HNil}
import shapeless.ops.hlist.Align
implicit def toOther[A <: HList, B <: HList](v: A)(implicit a: Align[A, B]): B = v.align[B]
def method(p: Int :: Boolean :: HNil): Unit = println("success")
val list = false :: 7 :: HNil
// works on it's own. (only for Hlists of same length though)
toOther[Boolean :: Int :: HNil,Int :: Boolean :: HNil](list)
//doesn't work! Weird!
// also if it did, it only would for two HLists of the same length
method(list)
答案 0 :(得分:3)
对于转换部分,我认为您正在寻找的是SelectAll
类型类。至于为什么转换没有隐含地启动我还不确定。在这种情况下,预期和实际类型都是已知的,就像在您的示例中一样,编译器有足够的信息来选择toOther
。
import shapeless._, ops.hlist.SelectAll
implicit def toOther[A <: HList, B <: HList](a: A)(implicit convert: SelectAll[A,B]): B = convert(a)