我有些困惑 Html msg 类型是什么,或者它是如何使用的。 我在 VirtualDom.elm 中找到了这行代码,其中 Html msg 似乎是一个别名:
type Node msg = Node
这看起来像是一个带有一个类型参数msg
和一个不包含额外信息的平凡情况的通用联合类型。我想知道:
div
函数如何构造这些对象?- 这样的对象如何使用?
- 这样的对象如何被使用?
- 对于用户定义这样的类型是否有价值,或者
Html msg
只是支持Elm编译器/运行时的神奇类型?
我有些困惑 Html msg 类型是什么,或者它是如何使用的。 我在 VirtualDom.elm 中找到了这行代码,其中 Html msg 似乎是一个别名:
type Node msg = Node
这看起来像是一个带有一个类型参数msg
和一个不包含额外信息的平凡情况的通用联合类型。我想知道:
div
函数如何构造这些对象?Html msg
只是支持Elm编译器/运行时的神奇类型?Html msg
是一个 类型别名,它是 Node msg
的一种,而 Node msg
则是一个通用联合类型。
Node msg
只有在 Elm 架构的上下文中,才有意义去思考关于 Node msg
类型签名的问题,在这个架构中,除了 Http.App.programWithFlags
的标志位之外,你的应用程序所有输入都会通过消息来实现。
Node msg
中的 msg
类型变量只是向你暗示了这样一个想法:你 DOM 子树中的所有消息都应该属于一个单一的联合类型。
node
: String
-> List (Attribute msg)
-> List (Html msg) -- List of children nodes with a msg
-> Html msg -- Produced DOM node
通过msg
类型变量,Elm编译器知道在Elm架构上下文中你的DOM树是否正确。
在JavaScript世界中,Node msg
联合类型的Node
值表示具有以下结构的对象:
{
"type":"node",
"tag":"div",
"facts":{}, // Attributes and DOM events
"children":[], // Children, have the same structure
"descendantsCount": 0 // Used for Virtual DOM diffing
}
大多数复杂的核心数据结构是使用通用的联合类型实现的。请参考Maybe或Dict以获取灵感。
Html msg
和用户定义的通用联合类型Html msg
特别神奇,但您可以实现一些有趣的结构,例如链表或其他树形结构。
type List a =
Empty | Node a (List a)