动态增长异构列表,Scala

时间:2013-10-14 12:45:18

标签: list scala map shapeless heterogeneous

有没有办法坚持(我的意思是保留在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说得更好找到我问题的另一个解决方案。

1 个答案:

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