了解Elm中的泛型联合类型

时间:2016-07-25 02:41:35

标签: elm

我无法理解Html msg类型究竟是什么,或者它是如何被使用的。我在VirtualDom.elm中找到了这行代码,Html msg似乎是别名:

type Node msg = Node

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

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

1 个答案:

答案 0 :(得分:11)

Html msgNode 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世界NodeNode 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 TypeMaybe以获得灵感。

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

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

type List a =
  Empty | Node a (List a)