我怎样才能通过一些HList
作为论点?所以我可以这样制作:
def HFunc[F, S, T](hlist: F :: S :: T :: HNil) {
// here is some code
}
HFunc(HList(1, true, "String")) // it works perfect
但是,如果我有一个很长的列表,而我对此一无所知,我该如何对其进行一些操作呢?我怎样才能传递参数而不丢失它的类型?
我怎样才能通过一些HList
作为论点?所以我可以这样制作:
def HFunc[F, S, T](hlist: F :: S :: T :: HNil) {
// here is some code
}
HFunc(HList(1, true, "String")) // it works perfect
但是,如果我有一个很长的列表,而我对此一无所知,我该如何对其进行一些操作呢?我怎样才能传递参数而不丢失它的类型?
这取决于您的用例。
HList
对于类型级代码很有用,所以你不仅应该传递给你的方法HList
,还应该传递所有必要的信息,如下所示:
def hFunc[L <: HList](hlist: L)(implicit h1: Helper1[L], h2: Helper2[L]) {
// here is some code
}
例如,如果你想要reverse
你Hlist
的map
结果,你应该使用Mapper
并且Reverse
像这样:
import shapeless._, shapeless.ops.hlist.{Reverse, Mapper}
object negate extends Poly1 {
implicit def caseInt = at[Int]{i => -i}
implicit def caseBool = at[Boolean]{b => !b}
implicit def caseString = at[String]{s => "not " + s}
}
def hFunc[L <: HList, Rev <: HList](hlist: L)(
implicit rev: Reverse[L]{ type Out = Rev },
map: Mapper[negate.type, Rev]): map.Out =
map(rev(hlist)) // or hlist.reverse.map(negate)
用法:
hFunc(HList(1, true, "String"))
//String :: Boolean :: Int :: HNil = not String :: false :: -1 :: HNil