理解 Elm 中的通用联合类型

17

我有些困惑 Html msg 类型是什么,或者它是如何使用的。 我在 VirtualDom.elm 中找到了这行代码,其中 Html msg 似乎是一个别名:

type Node msg = Node

这看起来像是一个带有一个类型参数msg和一个不包含额外信息的平凡情况的通用联合类型。我想知道:

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

这种模式在定义不透明类型时非常常见,其结构实际上是由本地JS代码操作的。您可以在此处查看:https://github.com/elm-lang/virtual-dom/blob/1.1.0/src/Native/VirtualDom.js - jmite
1个回答

13

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

如何使用泛型Union类型的
函数

通过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
}

如何使用通用的联合类型

大多数复杂的核心数据结构是使用通用的联合类型实现的。请参考MaybeDict以获取灵感。

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

Html msg特别神奇,但您可以实现一些有趣的结构,例如链表或其他树形结构。

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

1
联合类型现在在0.19中被称为“自定义类型” https://guide.elm-lang.org/types/custom_types.html - TankorSmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接