1

有没有办法坚持(我的意思是保持在一个变量中)(有可能吗?)动态增长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所以 ofc 它可以工作,但由于输入不正确,我们甚至不能这样做HList(据我所知,list甚至根本不保留类型参数)。

结果类型:

shapeless.HList = true :: foo :: 2 :: 1 :: HNil

所以,这是不正确的。

编辑

上面的信息还不够,我明白了。

所以我想有一些对象,就像一个变量,它可以是任何HList类型的;

class className {
    var hlist: HList = _ // it is not correct
}

为了有时HList在这个变量中传递;

className.hlist = llist

ps @milessabin mb 是的,最好为我的问题找到另一个解决方案。

4

1 回答 1

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

reverseon方法实现为折叠(在HList类型和值级别),可以在此处找到。

于 2013-10-14T15:48:10.343 回答