List Scala函数中的异构参数

List Scala函数中的异构参数,list,scala,shapeless,heterogeneous,hlist,List,Scala,Shapeless,Heterogeneous,Hlist,如何将一些HList作为参数传递?所以我可以这样做: def HFunc[F, S, T](hlist: F :: S :: T :: HNil) { // here is some code } HFunc(HList(1, true, "String")) // it works perfect 但是如果我有一个很长的列表,而且我对它一无所知,我怎么能对它进行一些操作呢? 如何传递参数而不丢失其类型?这取决于您的用例 HList对于类型级别的代码很有用,因此您不仅应该向方法传递H

如何将一些
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
}
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

你想在方法体中执行什么类型的操作?嗯,一些类型相关的对象可以存储在这个列表中,我不想丢失关于对象类型的信息。所以我需要mb所有关于
HLists
-
map,head等的操作。
:)是的,我明白了,例如:
def hFunc[L@DaunnC:Not
TypeTag
。你应该使用
Mapper
来表示
map
Reverse
来表示
Reverse
等等。@DaunnC:我想源代码、示例和测试是最好的学习资源。你也可以阅读stackoverflow。我不知道其他有用的链接。请参阅我答案中的更新,了解代码示例。