我想解析包含付款或客户或帐户列表的xml文件。结果将是适当类的列表。 付款,客户或帐户有很多字段(50 - 100)。 A可以将它们划分为几个类,但主类仍然会有很多字段。 如果我使用java,我将创建适当的类并使用set方法设置所有值,但是使用Scala创建具有大量不可变值的类的功能方式是什么? 如何在Haskell中创建相同的东西?
答案 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吗?
编辑以解决您的意见 -
实际上只有三种方法可以从外部准类型数据中填充类型化结构....
像我上面那样写了很多样板代码....这真是太丑了。
将数据存储在单个多重类型的表单中,将其存储在统一类型的容器(如Map)中。类型信息的丢失总是很糟糕,但对于Haskell社区来说更是如此,Haskell社区以其丰富的类型规范而自豪。
使用框架自动生成和填充数据结构(如数据库的Yesod / Persistent)。我自己从未使用它,但HaXmL有类似的东西,它似乎会从数据库模式自动生成类型化日期。
答案 2 :(得分:-1)
您是否考虑过使用无类型解析器,例如:
http://wiki.fasterxml.com/JacksonTreeModel
这就是我在我的Scala应用程序中所做的事情(可能有一个稍微好一点的解析器库)。我想说这比巨型Java / Scala元组类型更合适。
创建大量Scala元组类型没有特殊的快捷方式。只需添加大量的val。