【问题标题】:Dynamically growing heterogeneous list, Scala动态增长的异构列表,Scala
【发布时间】:2013-10-15 00:12:48
【问题描述】:

有没有办法持久化(我的意思是保留在 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

显然,此代码不起作用。所以 ofc 它可以工作,但由于 HList 输入不正确,我们甚至不能做 list.head(据我所知,list 甚至根本不保留类型参数)。

结果类型:

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

所以,这是不正确的。

编辑

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

所以我想在某个对象中包含一个变量,它可以是任何HList 类型;

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

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

className.hlist = llist

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

【问题讨论】:

  • 你能澄清你所说的坚持是什么意思吗?我想也许你的意思是进入数据库。我不确定您是否想要 HList 的 HList 或最终产品/目标应该是什么。
  • 好的,谢谢,我已经编辑了;顺便说一句,我的意思是动态地将元素添加到带有一些HList 的变量中,例如将一些元素添加到现有列表(例如空)......但在我看来这是不可能的,因为我们无法重新定义变量类型。在简单列表的情况下,我们可以实现这一点,子类型的原因,实际上我们丢失了关于类型的信息。所以,谢谢你!是否可以删除问题,因为它没有用,最可能的答案是“否”?
  • 动态增长 HList 是标准用例。他们有 append 和所有内置的东西。
  • 如果您展示了您希望能够编写的代码,这可能会有所帮助。
  • 好的,我已经更新了帖子

标签: list scala map shapeless heterogeneous


【解决方案1】:

我不太清楚你在这里想要达到什么目的。总的来说,您应该尝试从功能折叠和展开的角度进行思考,而不是可变更新。

您在问题中显示的特定问题的解决方案就是,

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

HList 上的 reverse 方法实现为折叠(在类型和值级别),可以在 here 中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多