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 时代一样表达自己:-)