如何创建具有大量不可变字段的类?

时间:2013-12-18 14:18:02

标签: scala haskell

我想解析包含付款或客户或帐户列表的xml文件。结果将是适当类的列表。 付款,客户或帐户有很多字段(50 - 100)。 A可以将它们划分为几个类,但主类仍然会有很多字段。 如果我使用java,我将创建适当的类并使用set方法设置所有值,但是使用Scala创建具有大量不可变值的类的功能方式是什么? 如何在Haskell中创建相同的东西?

3 个答案:

答案 0 :(得分:2)

Scala 2.11将add support for case classes with more than 22 parameters。因此,您可以按照惯例实现50个成员的不可变类:

case class Person(name: String, age: Int)

答案 1 :(得分:0)

我会回答Haskell ....

这是一个不可变的Java类

class Person {
    final private int age;
    final private String name;

    public int getAge() { return this.age; }
    public string getName() { return this.name; }
    final private OtherStuff otherstuff;
    public Foo(String name, int age) { 
       this.name = name;
       this.age = age;
    }   
}

这是相应的Haskell定义

data Person = Person{name::String, age::Int}

这就是我们创建Person对象的方式

Person person = new Person("fred", 101);  // in Java
person = Person{name="fred", age=101} --In Haskell (prefix with "let" if in do notation)

以下是我们如何在Java中创建对象数组 -

List<Person> people = new ArrayList<Person>
foreach(Raw rawPerson: rawData) {
    Person person = new Person(getName(rawPerson), getAge(rawPerson));
    ints.add(person)
}

这是在Haskell

raw2List = map (Person <$> getName <*> getAge)

(Haskell的版本是懒惰的,所以除非你使用raw2List,否则它不会做任何事情....实际上我相信它甚至会在整个Person列表创建完成之前开始收集XML parsetree垃圾...有人可以为我验证这个吗?)。


最后一块拼图 - XML库(即'原始'数据来自何处)。

两个世界都有一些可供选择 -

常用的Java XML库-DOM,Sax

常用的Haskell XML库-xml-conduit,HXT,HaXmL

现在,Scala人,你能将它翻译成Scala吗?


编辑以解决您的意见 -

实际上只有三种方法可以从外部准类型数据中填充类型化结构....

  1. 像我上面那样写了很多样板代码....这真是太丑了。

  2. 将数据存储在单个多重类型的表单中,将其存储在统一类型的容器(如Map)中。类型信息的丢失总是很糟糕,但对于Haskell社区来说更是如此,Haskell社区以其丰富的类型规范而自豪。

  3. 使用框架自动生成和填充数据结构(如数据库的Yesod / Persistent)。我自己从未使用它,但HaXmL有类似的东西,它似乎会从数据库模式自动生成类型化日期。

答案 2 :(得分:-1)

您是否考虑过使用无类型解析器,例如:

http://wiki.fasterxml.com/JacksonTreeModel

这就是我在我的Scala应用程序中所做的事情(可能有一个稍微好一点的解析器库)。我想说这比巨型Java / Scala元组类型更合适。

创建大量Scala元组类型没有特殊的快捷方式。只需添加大量的val。