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, ...)
この相互再帰は理論的には可能かしら?
2番目の質問:
モデルをウィキマークアップにレンダリングします。これは、オーバーロードされた再帰的な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の時代とほぼ同じように自分自身を表現できるようになりました:-)