在Elm,有没有办法合并联合类型?(用于模块化目的)

Ale*_*xHv 5 modularity elm union-types

从这三个声明开始:

type SharedMsg
   = SharedAction

type Page1Msg
   = Page1Action

type Page2Msg
   = Page2Action
Run Code Online (Sandbox Code Playgroud)

我有办法获得相同的以下一个?就像一种"合并"联盟类型的方式?

type Msg
   = SharedAction
   | Page1Action
   | Page2Action
Run Code Online (Sandbox Code Playgroud)

=============================

上下文:我将Elm应用程序拆分为每页一个模块,并带有自己的文件夹.

某些操作将被共享,某些操作将特定于页面.

如果我要使用该Html.map方法,我觉得我必须重新编写页面在其自己的PageMsg消息类型中使用的每个共享操作:

type Page1Msg
   = Page1Action
   | SharedAction

type Msg
   = Page1Msg Page1Msg
   | Page2Msg Page2Msg

view : Model -> Html Msg
view =
   Html.map Page1Msg (Page1View.view model)
Run Code Online (Sandbox Code Playgroud)

因此我考虑Msg为所有页面使用唯一类型,但通过在自己的文件夹中编写特定于页面的消息来保留模块性,然后以某种方式Msg通过合并它们来定义唯一类型.

Mar*_*zek 6

@ z5h的答案几乎是正确的,但类型构造函数必须有不同的名称.

您无法按照自己喜欢的方式合并类型.

至于惯用的方式:你只是命名分裂类型Msg,而不是Page1Msg.所以,例如:

Page1.elm:

module Page1 exposing (Msg)

type Msg
  = Foo
Run Code Online (Sandbox Code Playgroud)

Page2.elm:

module Page2 exposing (Msg)

type Msg
  = Bar
Run Code Online (Sandbox Code Playgroud)

Shared.elm:

module Shared exposing (Msg)

type Msg
  = Baz
Run Code Online (Sandbox Code Playgroud)

Main.elm:

module Main exposing (..)

import Shared
import Page1
import Page2

type Msg
  = SomethingCustom
  | SharedMsg Shared.Msg
  | Page1Msg Page1.Msg
  | Page2Msg Page2.Msg
Run Code Online (Sandbox Code Playgroud)

顺便说一下,请记住,如果将模块拆分为Page1.View,Page1.Types等等,那么只要暴露的函数不重叠,就可以使用相同的名称导入不同的模块,即:

import Page1.Types as Page1
import Page1.State as Page1
import Page1.View as Page1
import Page1.Decoders as Page1
Run Code Online (Sandbox Code Playgroud)