SVG解析和数据类型

Eli*_*ard 5 parsing haskell types

我正在编写一个SVG解析器,主要是作为学习如何使用Parsec的练习.目前我使用以下数据类型来表示我的SVG文件:

data SVG = Element String [Attribute] [SVG]
         | SelfClosingTag [Attribute]
         | Body String
         | Comment String
         | XMLDecl String
Run Code Online (Sandbox Code Playgroud)

这很有效,但我不确定Element String [Attribute] [SVG]我的数据类型的部分.由于SVG 的潜在标签数量有限,我考虑使用类型来表示SVG元素而不是使用String.像这样的东西:

data SVG = Element TagName [Attribute] [SVG]
         | ...

data TagName = A
             | AltGlyph
             | AltGlyphDef
             ...
             | View
             | Vkern
Run Code Online (Sandbox Code Playgroud)

这是个好主意吗?如果有的话,这样做的好处是什么?有更优雅的解决方案吗?

Mat*_*att 4

我个人更喜欢枚举所有可能的方法TagName。这样,如果您犯了任何粗心的错误,编译器可以给您错误和警告。例如,如果我想编写一个涵盖 的所有可能类型的函数Element,那么如果 ADT 中枚举了每种类型,则编译器可以向您提供非详尽的匹配警告。如果将其表示为字符串,则这是不可能的。此外,如果我想匹配Element特定类型的 ,并且我不小心拼错了TagName,编译器会捕获它。第三个原因可能并不真正适用于此,但一般来说值得注意的是,如果我稍后决定添加或删除 的变体TagName,那么编译器会告诉我需要修改的每个地方。我怀疑 SVG 标签名称会发生​​这种情况,但总的来说,这是需要记住的事情。