Это зависит от вашего прецедента.
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
Какие операции вы хотите выполнять в теле метода? –
hm, некоторые типы зависимых объектов могут быть сохранены в этом списке, и я не хочу терять информацию о типах объектов. Поэтому мне нужно mb все операции над 'HLists' -' map, head и т. Д. ':) – DaunnC