理解Elm中的泛型联合类型
我在理解理解Elm中的泛型联合类型,elm,Elm,我在理解htmlmsg类型的确切含义以及如何使用它时遇到了一些困难。我在VirtualDom.elm中发现了这行代码,它的Html msg似乎是: type Node msg = Node 这看起来像是一个通用的联合类型,有一个类型参数,msg,还有一个不包含任何附加信息的小案例。我想知道: div函数如何构造这些对象之一 像这样的物体是如何使用的 这样的东西怎么会被使用呢 用户定义这样的类型是否有任何价值,或者Html msg只是一种支持Elm编译器/运行时的神奇类型 Html msg是节点
htmlmsg
类型的确切含义以及如何使用它时遇到了一些困难。我在VirtualDom.elm中发现了这行代码,它的Html msg
似乎是:
type Node msg = Node
这看起来像是一个通用的联合类型,有一个类型参数,msg
,还有一个不包含任何附加信息的小案例。我想知道:
div
函数如何构造这些对象之一Html msg
只是一种支持Elm编译器/运行时的神奇类型Html msg
是节点msg
的
联合类型节点消息
只有在Elm体系结构的上下文中对Node msg
类型签名进行推理才有意义,其中应用程序的所有输入(Http.App.programWithFlags的标志除外)都是通过消息进行的
msg
节点msg中的type变量只是向您暗示,来自DOM子树的所有消息都应该属于单个联合类型
node
: String
-> List (Attribute msg)
-> List (Html msg) -- List of children nodes with a msg
-> Html msg -- Produced DOM node
div
函数如何使用泛型联合类型
由于msg
type变量,Elm编译器知道在Elm体系结构的上下文中DOM树何时是正确的
在JavaScript世界中,Node
节点msg
的值用以下结构表示对象:
{
"type":"node",
"tag":"div",
"facts":{}, // Attributes and DOM events
"children":[], // Children, have the same structure
"descendantsCount": 0 // Used for Virtual DOM diffing
}
如何使用泛型联合类型
大多数复杂的核心数据结构都是使用泛型联合类型实现的,检查或获取灵感
Html msg
和用户定义的通用联合类型
Html-msg
特别有点神奇,但您可以实现一些有趣的结构,如链表或其他树状结构
type List a =
Empty | Node a (List a)
这种模式在定义不透明类型时非常常见,不透明类型的结构实际上是由本机JS代码操纵的。你可以在这里看到: