Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Elm中的泛型联合类型_Elm - Fatal编程技术网

理解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代码操纵的。你可以在这里看到: