将一个HList隐式转换为另一个HList

时间:2017-04-18 17:36:55

标签: scala shapeless

我的库中有一个用例,如果<{>}包含 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)

1 个答案:

答案 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)