模式匹配嵌套联合类型

Pattern-matching the nested union types

我正在为计数 up/down 计时器建模。设置起始日期后,计时器会显示自该起始日期以来已经过去了多少时间,或者到该起始日期还剩多少时间。

type OriginDefined
    = Up Date
    | Down Date


type Origin
    = OriginDefined
    | OriginUndefined


type Model
    = Tick OriginDefined
    | Edit Origin

因此,计时器仅在定义起始日期时才开始计时。但是,编辑原点时,它之前可能已定义,也可能未定义。

现在我需要一个函数来 return defaultValue 作为日期输入,当我们处于 Edit 模式时。

dateInputDefaultValue : Origin -> String
dateInputDefaultValue origin =
    case origin of
        OriginUndefined ->
            ""

        OriginDefined ->
            ...

在这里,我努力将 origin 进一步解构为 Up dateDown date。在 case 表达式的第二个分支中,编译器拒绝将 origin 视为比 Origin.

更具体的任何内容

这是艾莉 https://ellie-app.com/3zKCcX87wa1/0

我应该如何处理这样的模型?我应该以不同的方式建模吗?

您的类型可以编译,但是您有两个不同的 OriginDefined 定义:一个是名为 OriginDefined 的类型,它有两个构造函数,UpDown。另一个是 Origin.

类型的无参数构造函数

我的预感是您试图让 Origin 上的 OriginDefined 构造函数携带类型 OriginDefined 的值。为此,您必须在 OriginDefined 构造函数上定义 OriginDefined 类型的参数:

type Origin
    = OriginDefined OriginDefined
    | OriginUndefined

现在你有了一个与 Elm 的 Maybe 类型同构的类型,所以删除 OriginDefined 类型并替换 Origin 与此:

type Origin
    = Up Date
    | Down Date

现在您可以在以前使用 defined/undefined 命名法的地方使用 Maybe

type Model
    = Tick (Maybe Origin)
    | Edit Origin

Maybe Origin 上的模式匹配可能如下所示:

dateInputDefaultValue : Maybe Origin -> String
dateInputDefaultValue origin =
    case origin of
        Nothing ->
            ""

        Just (Up date) -> 
            "…"

        Just (Down date) -> 
            "…"