考虑以下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
然而,这将污染全局命名空间。例如,类型Key
或Value
对于使用其他数据结构的代码中的其他地方是有意义的。然而,后面的例子对我来说看起来更具可读性,而第一个例子似乎很迂腐。
你会如何实现这个?
答案 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-markup,threepenny-gui。