使用GADT构建具有不同节点类型和父子关系规则的树

时间:2012-11-18 11:15:53

标签: haskell tree gadt

我正在尝试使用简单的xml包为自定义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中,有规则指定可以嵌套在每种元素下的元素。是否可以定义GADT来构建基于这些规则限制结构的XML片段?规则只列出允许哪种父子关系(例如,Response不能是任何其他元素的子元素,SendAnswer可以是Response的子元素等)。

这是我走了多远:https://gist.github.com/4104499

执行时,输出:

<Response>

  <Speak loop="2">

    http://example.com/a.mp3
  </Speak>
</Response>

但是,我认为这种方法有许多缺点:

  1. MyXMLElement(第31行)的数据定义将需要与有效父子关系一样多的行。在不同的实现中,可以只列出元素的合法子元素,并在运行时检查合法关系。我选择了这种方法(使用GADT),因此无效的XML树在编译时是非法的。
  2. eval给出的界面非常有限:它不允许任意嵌套(即使遵循父子关系规则);它不允许根据需要添加XML属性。
  3. 我想知道这个问题是否适合使用GADT的解决方案。如果是的话,怎么设计得更好呢?

0 个答案:

没有答案