在2.8.x中管理Scala中的灵活,类型化,不可变的数据结构

时间:2010-02-09 02:11:39

标签: scala immutability scala-2.8 functional-programming

这是Scala 2.8.0测试版的一个后续问题:

What is a proper way to manage flexible, typed, immutable data structures in Scala?

新技术是复制案例类,例如

case class Person(name:String, email:String)

val bob = Person("Bob", "bob@z.com")
val jill = bob.copy(name = "Jill")

这很有用,除了Scala似乎将我限制在案例类中的22(?)属性。这可能看起来很多,但在我的情况下还不够。

使用23,我得到:“错误:类型Function23不是包scala的成员”。我可以定义自己的Function23等,但我不知道它的含义。

所以现在我回到原点。我需要使用我试图避免使用的公共变量,或者创建一个26+参数构造函数和一个配对复制方法。 ICK。

22这似乎是一个相当随意的限制。有办法解决这个问题吗?

这是用于数据导入,如下所示:

new CatalogImportRecord() {
    override val List(SVal(vendorSku), SVal(title), IVal(issues),
      _, // YToMVal(termMonths),
      DVal(sellPrice), DVal(buyPrice), DVal(retailPrice), NotesVal(allowsNew, allowsRenewals),
      _) //DateValMdy(lastUpdated))
      = fields

您可以看到我注释掉了未使用的提取以减少字段数。

也许有更好的方法来做到这一点。我发现这种提取技术有点僵硬,但这可能是最好的。

3 个答案:

答案 0 :(得分:4)

代码是自动生成的,因此如果您只是自己使用该项目,则可以重新编译Scala库(更改设置)。

如果您在案例类中手动输入23个以上的内容,请考虑以任何方便的方式对您的值进行分组 - 使用元组将有意义的内容组合在一起,或者使用子案例类来更紧密地对事物进行分组。它会使更新变得更加尴尬,但是如果你将需要一起更新的内容分组,它应该有所帮助。

例如,在Scala 2.8中试试这个:

((1,2,3,4,5,6,7,8,9),(1,2,3,4,5,6),(1,2,3,4,5,6,7,8,9)).copy(_2=(4,5,6,7,8,9))

如果你已经在val中获得了原版,那么改变一件事就更容易了:

val a = (1,2,(1,2))
a.copy(_3=a._3.copy(_1=3))

答案 1 :(得分:2)

请参阅src / build目录中的genprod.scala,修改它,使用它生成所需的arity,然后重新编译库。您可能需要保留修改后的Scala库。

也许可以将这些额外的类分开,编译它们,并将它们保存在另一个jar文件中。我不知道,但我期待它值得一试。

或者使用地图而不是案例类。

答案 2 :(得分:1)

您是手动编写这些庞大的案例类吗?

如果您以编程方式合成它们,那么您始终可以复制编译器为案例类所做的工作,并在没有Product22限制的情况下获得基本相同的结果。它为案例类所做的一切都在Scala源中具有等效的非案例类。