1

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の時代とほぼ同じように自分自身を表現できるようになりました:-)

4

1 に答える 1

4

A:不変で相互に依存するクラスの初期化については、この質問をご覧ください。

B:質問render: Foo => String関数とRenderableスーパークラスに関して、これは多かれ少なかれ、機能的アプローチとオブジェクト指向アプローチの間の設計上の決定です。個人的には、どちらかが優れているとは思いません。好みの問題です。論文「表現問題の独立して拡張可能な解決策」は、少し複雑な文脈ではありますが、2つの間の優れた比較があります(ただし、これは素晴らしい読み物です)。

C:コンパニオンオブジェクトはコンパイラによって作成されますが、コンパニオンオブジェクトも指定すると、コンパイラは2つをマージします。

D:現在のクラス階層には、との自明でない共通のスーパータイプがないためIssueFieldの意味のある戻り型を指定することは困難ですfromXML。で作業することもできますがEither[Issue, Field]、これは私には怪しいように見えます。一般に、本格的なノード(eg、Task)を返すはずの関数と「内部」ノード(eg、Status)を返す関数を混在させることは避けます。

E:scalaxbなどの既存のソリューションを見ましたか?あなたはここここでより多くのリンクを見つけることができます。

于 2012-08-06T20:20:50.447 に答える