xml
simpleパッケージを使用して、カスタム XML 構造用の XML ジェネレーターを構築しようとしています。サンプルの XML フラグメントを次に示します。
<Response>
<Answer>Hello World</Answer>
<Play loop="3">http://example.com/a.mp3</Play>
<SendAnswer dest="someuri">
<Answer>Something</Answer>
<Play>someuri</Play>
</SendAnswer>
</Response>
このカスタム XML には、各種類の要素の下にネストできる要素を指定する規則があります。これらの規則に基づいて構造を制限する XML フラグメントを構築するために GADT を定義することは可能ですか? ルールは、許可される親子関係の種類を単純にリストしたものです (たとえば、Response は他の要素の子にすることはできず、SendAnswer は Response の子にすることができます)。
これが私が得た距離です:https://gist.github.com/4104499
実行すると、次のように出力されます。
<Response>
<Speak loop="2">
http://example.com/a.mp3
</Speak>
</Response>
ただし、このアプローチには多くの欠点があると思います。
- MyXMLElement のデータ定義 (31 行目) には、有効な親子関係と同じ数の行が必要になります。別の実装では、要素の有効な子のみをリストし、実行時に有効な関係をチェックすることができます。このアプローチ (GADT を使用) を選択したのは、コンパイル時に無効な XML ツリーが不正になるようにするためです。
- eval によって提供されるインターフェイスは非常に制限されています。任意のネストは許可されません (親子関係のルールに従っている場合でも)。必要に応じて XML 属性を追加することはできません。
この問題が GADT を使用したソリューションに適しているかどうかを知りたいです。もしそうなら、どうすればより良い設計ができますか?