我无法理解Html msg
类型究竟是什么,或者它是如何被使用的。我在VirtualDom.elm中找到了这行代码,Html msg
似乎是别名:
type Node msg = Node
这看起来像是具有一个类型参数msg
的通用联合类型,以及一个不包含其他信息的简单案例。我想知道:
div
函数如何构造其中一个对象?Html msg
只是一种支持Elm编译器/运行时的神奇类型?答案 0 :(得分:11)
Html msg
是Node msg
的{{3}},Type Alias
Node msg
在Elm Architecture的上下文中推理Node msg
类型签名是有意义的,其中除了Http.App.programWithFlags
的标志之外,您的应用程序的所有输入都通过消息发生。
msg
中的 Node msg
类型变量只暗示您的想法,即来自DOM子树的所有消息都应属于单个联合类型。
node
: String
-> List (Attribute msg)
-> List (Html msg) -- List of children nodes with a msg
-> Html msg -- Produced DOM node
div
函数如何使用通用联合类型感谢msg
类型变量,Elm编译器知道,当您的DOM树在Elm Architecture的上下文中是正确的时。
在JavaScript世界Node
值Node msg
Union Type表示具有以下结构的对象:
{
"type":"node",
"tag":"div",
"facts":{}, // Attributes and DOM events
"children":[], // Children, have the same structure
"descendantsCount": 0 // Used for Virtual DOM diffing
}
大多数复杂的核心数据结构都是使用通用联盟类型实现的,请检查Generic Union Type或Maybe以获得灵感。
Html msg
和用户定义的通用联盟类型 Html msg
特别有点神奇,但你可以实现一些有趣的结构,比如链表或其他树状结构。
type List a =
Empty | Node a (List a)