2012-08-06 106 views
1

scala中可能存在相互递归类型?scala中的相互递归类型

我有一个错误跟踪问题列表的XML文件。这是原始数据。该模型具有不同的问题类型,如“任务”,“子任务”,“错误”,“特殊错误”。

现在,我想我的原始数据解析到任务和子任务的层次结构:

// data type for field contents 
abstract class Field 
case class Id(raw : string) extends Field 
case class Status(raw : string) extends Field 
... 

// data type for primary model 
abstract class Issue(id : String, ...) 
case class Task(id : Id, status : Status ..., subtasks : List[Subtask]) extends Issue(id, ...) 
case class Subtask(id : Id, status : Status ..., parent: Task) extends Issue(id, ...) 

不知这相互递归在理论上是可能的吗?

第二个问题:

我渲染模型的一些维基的标记。这适用于重载的递归render():数据类型的类中的字符串。 (或许我应该有一个“渲染”超类!?)

什么是用于分析最彻底的方法,即我想有一个递归

fromXML : scala.xml.Elem => Issue/Field 

我会放在哪里呢?它会是什么样子? IIUC,同伴是自动生成的case-classes,所以我不能添加到它?

我有这个例如为:

def fromXml(e : Elem) = e match { 
    case <a>test</a> => Id("test") 
    case _ => Status("Pre-analysed") 
} 

但我没有给功能的类型。什么该函数的类型?

我也想过将xml-elem直接传递给ADT的构造函数,那会很聪明吗?还是应该分离XML解析和模型创建?


耶稣,学习斯卡拉基本知识,并做一些脚本和函数(想太多JAVA)之后,我终于明白了如何写抽象数据类型,可以表达自己几乎一样的好老哈斯克尔次:-)

+1

你应该改进你的问题的结构,使其更清楚你的总体目标是什么;尝试以有意义的方式将你的子问题分组(我没有倒下你)。 – 2012-08-06 20:22:35

+0

@ mhs:是的,你说得对,我只是写下了我的项目的开放式结尾。没关系,你的答案有助于进一步... – Bastl 2012-08-07 06:35:49

回答

4

答:关于初始化不可变,相互依赖的类,请看this question

B:关于你的问题render: Foo => String功能与Renderable超,这是恕我直言,或多或少的功能和面向对象的方法之间的设计决策。我个人认为他们中的一个比另一个优越,这只是一个品味问题。纸"Independently Extensible Solutions to the Expression Problem"有一个很好的比较,虽然在一个稍微更复杂的上下文(这是一个伟大的阅读,但是)。

C:伴随对象由编译器创建,但如果您还指定伴随对象,则编译器会合并这两个对象。

d:在当前的类层次结构存在的IssueField没有非平凡普通的超类型,这使得它很难给出一个有意义的返回类型为fromXML。不过,你可以使用Either[Issue, Field],但这看起来很腥。一般来说,我会避免应该返回完整节点的混合函数(例如,Task)与那些返回“内部”节点的节点(例如Status)。

E:您是否看过现有的解决方案,例如: scalaxb?你可以找到更多的链接herehere

+0

有关D:我明白了,但我已经有问题只有字段类型。当我从XML(e:Elem):Field中写入时,匹配给了我不兼容的类型字段<-> Id,我不udnerstand,因为Id是字段的子类(在OO意义上)。那个函数的(返回)类型是什么? – Bastl 2012-08-07 06:49:59

+0

''fromXML(e:Elem):Field''适用于我,请参阅http://ideone.com/fneWq。 – 2012-08-07 07:20:04