用于在Haskell中描述HTML结构的命名策略

时间:2016-11-20 15:53:22

标签: haskell

考虑以下haskell类型,它们描述了HTML文档的基本结构:

data HTML               = HTML HTMLElement [HTMLElement]
data HTMLElement        = HTMLElement HTMLElementTagname [HTMLAttribute]
data HTMLElementTagname = HTMLElementTagname String
data HTMLAttribute      = HTMLAttribute (HTMLAttributeKey, HTMLAttributeValue)
data HTMLAttributeKey   = HTMLAttributeKey String
data HTMLAttributeValue = HTMLAttributeValue String

我的问题主要是关于这种结构的正确命名策略。查看最后一个类型HTMLAttributeValue的示例,它清楚地显示了已定义类型的层次结构,但仅仅是我使用的驼峰式约定。没有什么能阻止某人调用它value_of_html_attribute,只是举个例子。这可能被视为有问题。

另一个命名可能如下所示:

data HTML      = HTML HTML [Element]
data Element   = Element Tagname [Attribute]
data Tagname   = Tagname String
data Attribute = Attribute (Key, Value)
data Key       = Key String
data Value     = Value String

然而,这将污染全局命名空间。例如,类型KeyValue对于使用其他数据结构的代码中的其他地方是有意义的。然而,后面的例子对我来说看起来更具可读性,而第一个例子似乎很迂腐。

你会如何实现这个?

1 个答案:

答案 0 :(得分:1)

在第一个示例中,反映类型名称中的完整层次结构似乎过多。至于第二个例子,如果名称空间污染最终证明是一个问题,合格的导入是一个简单的解决方法:

module FooBar where -- etc.

data HTML      = HTML HTML [Element]
data Element   = Element Tagname [Attribute]
data Tagname   = Tagname String
data Attribute = Attribute (Key, Value)
data Key       = Key String
data Value     = Value String
import qualified FooBar as H

someHtml :: H.HTML
someHtml = -- etc.

一些相关的现有技术:blaze-markupthreepenny-gui