有没有办法坚持(我的意思是保留在var中)(有可能吗?)一个动态增长的HList
?我的伪代码:
var llist = 1 :: 2 :: "foo" :: true :: HNil
var list: HList = HNil // here is a wrong type! in fact we dont need HList type
object mapFunc extends Poly1 {
implicit def default[T] = at[T](t => { list = t :: list })
}
llist map mapFunc
显然,这段代码不起作用。因为它有效,但由于list.head
输入不正确,我们甚至无法HList
(因为我认识到,list
甚至根本没有保留类型参数。)
结果类型:
shapeless.HList = true :: foo :: 2 :: 1 :: HNil
所以,这是不正确的。
修改
上面的信息是不够的,我明白了。
所以我想在某个对象中,像变量一样,可以是任何HList
类型的变量;
class className {
var hlist: HList = _ // it is not correct
}
为了有时在此变量中传递HList
;
className.hlist = llist
P.S。 @milessabin mb说得更好找到我问题的另一个解决方案。
答案 0 :(得分:3)
我真的不清楚你在这里想要达到的目标。总的来说,你应该尝试用功能性折叠和展开来思考而不是可变更新。
您在问题中显示的具体问题的解决方案只是,
scala> val llist = 1 :: 2 :: "foo" :: true :: HNil
llist: Int :: Int :: String :: Boolean :: HNil = 1 :: 2 :: foo :: true :: HNil
scala> llist.reverse
res0: Boolean :: String :: Int :: Int :: HNil = true :: foo :: 2 :: 1 :: HNil
reverse
上的HList
方法实现为折叠(在类型和值级别),并且可以找到here。