了解Elm中的泛型联合类型

yxr*_*rkt 16 elm

我在理解究竟是什么Html msg类型或者如何使用它时遇到了一些麻烦.我在VirtualDom.elm中找到了这行代码,它Html msg似乎是别名:

type Node msg = Node
Run Code Online (Sandbox Code Playgroud)

这看起来像具有一个类型参数的通用联合类型msg,以及一个不包含其他信息的简单案例.我在想:

  1. div函数如何构造这些对象之一?
  2. 如何使用这样的对象?
  3. 怎么会这样的对象被使用?
  4. 用户是否有任何值来定义这样的类型,或者Html msg只是支持Elm编译器/运行时的神奇类型?

hal*_*bra 11

Html msg是一个类型别名Node msg,这是一种通用型联盟

联盟类型 Node msg

Node msg在Elm Architecture的上下文中推断类型签名是有意义的,其中除了标志之外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
Run Code Online (Sandbox Code Playgroud)

div函数如何使用泛型联合类型

感谢msg类型变量,Elm编译器知道,当您的DOM树在Elm Architecture的上下文中是正确的时.

在JavaScript中Node,Node msgUnion Type的世界值表示具有以下结构的对象:

{  
   "type":"node",
   "tag":"div",
   "facts":{},            // Attributes and DOM events
   "children":[],         // Children, have the same structure
   "descendantsCount": 0  // Used for Virtual DOM diffing
}
Run Code Online (Sandbox Code Playgroud)

如何使用通用联合类型

大多数复杂的核心数据结构都是使用通用联盟类型实现的,请检查MaybeDict以获得灵感.

Html msg 和用户定义的通用联合类型

Html msg 特别是有点神奇,但你可以实现一些有趣的结构,如链表或其他树状结构.

type List a =
  Empty | Node a (List a)
Run Code Online (Sandbox Code Playgroud)