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

2024-03-02

从这三个声明开始:

type SharedMsg
   = SharedAction

type Page1Msg
   = Page1Action

type Page2Msg
   = Page2Action

我有办法获得相当于以下内容的方法吗?就像一种“合并”联合类型的方法?

type Msg
   = SharedAction
   | Page1Action
   | Page2Action

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

上下文:我将 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)

因此我想到使用一种独特的Msg为所有页面键入内容,但通过在自己的文件夹中写入特定于页面的消息来保持模块化,然后以某种方式定义唯一的Msg通过合并它们来键入。


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

您无法按照您想要的方式合并类型。

至于惯用的方式:您可以将分割类型命名为Msg, not Page1Msg。因此,例如:

第1页.elm:

module Page1 exposing (Msg)

type Msg
  = Foo

第2页.elm:

module Page2 exposing (Msg)

type Msg
  = Bar

共享.elm:

module Shared exposing (Msg)

type Msg
  = Baz

主要.elm:

module Main exposing (..)

import Shared
import Page1
import Page2

type Msg
  = SomethingCustom
  | SharedMsg Shared.Msg
  | Page1Msg Page1.Msg
  | Page2Msg Page2.Msg

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

import Page1.Types as Page1
import Page1.State as Page1
import Page1.View as Page1
import Page1.Decoders as Page1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Elm 中,有没有办法合并联合类型? (出于模块化目的) 的相关文章

  • 高仿“饿了么”Vue项目(一)

    高仿 饿了么 Vue项目 一 当我们把Vue框架的概念过了一遍之后 要进一步提升 就要看看别人是怎么使用Vue框架来做项目了 在github上有不少好的Vue项目 我找到了其中的一个 并把它作为下一步学习的目标 链接地址 https git
  • 超限学习机(ELM)

    ELM Exteme learning machine 超限学习机 由新加坡南洋理工大学的Guangbin Huang 黄光斌 副教授提出的 1 算法概述 ELM算法针对的问题是单隐层的前馈神经网络 single hidden layer
  • TypeScript 中的“keyof typeof”是什么意思?

    向我解释一下什么keyof typeof在 TypeScript 中的意思是 Example enum ColorsEnum white ffffff black 000000 type Colors keyof typeof Colors
  • 传统 Java EE 服务器内的 OSGI 运行时

    我知道它可能应该是其他方式 OSGI 运行时托管 Java EE 服务器 因为它是显然玻璃鱼已经可以实现 http blogs oracle com arungupta entry totd 127 embedding glassfish
  • 长度示例中“List a”中的“a”是什么?

    我想知道在哪里可以找到有关 a 用在长度示例 http elm lang org examples length 似乎是某种类型 1 2 3 is a List Int 只能与整数列表一起使用的函数必须具有List Int在他们的类型签名中
  • 使用 elm 并选择

    我尝试通过自定义示例来了解 elm 的工作原理 durationOption duration option value toString duration text toString duration view Model gt Html
  • 使用本地包

    我在本地目录中有一个 Elm 包 源代码 所有构建工件 我想从另一个 Elm 包中使用它 而不发布库 所以我的目录设置如下所示 my lib elm package json my app elm package json 首先 跑步elm
  • elm 0.19.1 中的当前年份为 4 位数字

    如何使用 ELM 0 19 1 执行一个函数来获取 4 位数字的当前年份 我读过一些内容 但 0 19 1 没有任何效果 签名 getCurrentYear Int 执行 getCurrentYear gt 2020 Edit 也许正在执行
  • Networkx 中的社区检测

    我正在研究网络中的检测社区 我使用 igraph 和 Python 对于模块化度量方面的最佳社区数量 from igraph import karate Nexus get karate cl karate community fastgr
  • 如何在 elm 中按索引获取列表项?

    我有一个清单 现在我想要第 n 项 在哈斯克尔我会使用 但我找不到它的榆树变体 Elm 添加了数组0 12 1 http elm lang org blog announce 0 12 1 elm 并且在 0 19 中对实现进行了大规模修改
  • 使用knitr生成复杂的动态文档

    最小的可重现的示例 RE 下面是我尝试弄清楚如何使用knitr用于生成复杂的动态文档 这里的 复杂 不是指文档的元素及其布局 而是指非线性逻辑底层 R 代码块 虽然提供的 RE 及其结果表明solution 基于这种方法可能效果很好 我会喜
  • Elm:Json 解码器时间戳到日期

    我正在尝试将时间戳 例如 1493287973015 从 JSON 转换为日期类型 到目前为止 我创建了这个自定义解码器 stringToDate Decoder String gt Decoder Date stringToDate de
  • 模块化 Rails 应用程序

    我正在寻找一种模块化 Rails 应用程序的方法 正如我所见 没有内置的方法可以实现它 我发现了不同的插件 核心黑客 但我对它们的工作方式和成熟度感到不信任 您有这方面的经验吗 到目前为止我发现了这些 Desert http github
  • Task.perform 期望第三个参数是不同的类型

    我正在尝试将 Elm 教程改编为我自己的小项目 但我在使用我提供的 Json Decoder 时遇到了麻烦 我的代码如下所示 type Msg RetrieveComments FetchSucceed String FetchFail H
  • cabal 沙盒安装仍然失败,并显示“软件包可能会因重新安装而损坏”

    我正在尝试建立榆树平台 http elm lang org 使用阴谋集团沙箱 但是安装失败 并显示消息 软件包可能会因重新安装而损坏 在我看来 这似乎与沙盒的整个目的相矛盾 我曾相信沙盒应该避免这种错误 任何人都可以为我解释这个错误 甚至更
  • 如何从 Sass 样式表中仅导入变量和 mixin?

    我正在使用 Zurb Foundation 4 S CSS 框架 并且遇到了大量重复样式的问题 这是因为在每个文件中我 import foundation 中 Foundation 中的所有样式也会导入 规则body row button和
  • “foldp”是否违反了 FP 的不可变状态原则?

    我正在学习 Elm七周内增加七种语言 http pragprog com book 7lang seven more languages in seven weeks 下面的例子让我很困惑 import Keyboard main lift
  • 使用 Gradle 将模块化库发布到 Maven

    假设我使用 Gradle 进行模块化库开发 在我的根项目中我有子项目geometry algorithms visualizer 我想发布每个的 jar 工件 至于现在在我的根build gradle我有以下部分 apply plugin
  • 如何向这个 elm 效果示例添加第二个骰子?

    我是 Elm 新手 一直在查看以下示例 请注意 这是在较新的 0 17 架构下 其中 Action 现在是 Command http elm lang org examples random http elm lang org exampl
  • mypy,类型提示:Union[float, int] -> 是否有 Number 类型?

    mypy 确实很方便并且捕获了很多错误 但是当我编写 科学 应用程序时 我经常最终会这样做 def my func number Union float int Do something number是 float 或 int 具体取决于用

随机推荐