【发布时间】:2012-08-07 04:20:50
【问题描述】:
scala 中是否可以有相互递归的类型?
我有一个包含 bugtracker 问题列表的 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, ...)
不知道这种相互递归在理论上是否可行?
第二个问题:
我将模型渲染为一些 wiki 标记。这适用于重载的递归 render() :数据类型的类中的字符串。 (也许我应该有一个“可渲染”的超类!?)
什么是最干净的解析方式,即我想要一个递归
fromXML : scala.xml.Elem => Issue / Field
我会把它放在哪里?它会是什么样子? IIUC,同伴是为案例类自动生成的,所以我不能添加它?
我有这个例如:
def fromXml(e : Elem) = e match {
case <a>test</a> => Id("test")
case _ => Status("Pre-analysed")
}
但是我没有给函数一个类型。 是那个函数的类型?
我也想过将xml-elem直接传递给ADT的构造函数,这样会不会很聪明?还是应该将 XML 解析和模型创建分开?
天哪,在学习了 scala 基础知识并编写了一些脚本和函数(并且想太多 java)之后,我终于明白了如何编写 ADT,并且可以像在过去的 Haskell 时代一样表达自己:-)
【问题讨论】:
-
您应该改进问题的结构,使您的总体目标更清晰;尝试以有意义的方式对您的子问题进行分组(我没有对您投反对票)。
-
@mhs:是的,你是对的,我只是写下了我的项目的开放端。没关系,你的回答有助于更进一步......
标签: scala functional-programming