模式匹配嵌套的联合类型

时间:2017-12-22 17:49:54

标签: elm algebraic-data-types

我正在计算一个倒数/倒计时器。设置原始日期后,计时器将显示自 - 以来经过的时间,或者保持到原始日期为止。

type OriginDefined
    = Up Date
    | Down Date


type Origin
    = OriginDefined
    | OriginUndefined


type Model
    = Tick OriginDefined
    | Edit Origin

因此,只有在定义了原始日期时,计时器才会打勾。编辑原点时,可能已经或可能没有先前定义。

现在,当我们处于defaultValue模式时,我需要一个函数来返回日期输入的Edit

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

        OriginDefined ->
            ...

我努力将origin进一步解构为Up dateDown date。在case表达式的第2个分支中,编译器拒绝将origin视为比Origin更具体的内容。

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

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

1 个答案:

答案 0 :(得分:6)

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

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

type Origin
    = OriginDefined OriginDefined
    | OriginUndefined

现在你有一个与Elm的Maybe类型同构的类型,所以也许它可以减少混淆,更加惯用于删除OriginDefined类型并替换{{Origin类型的定义1}}用这个:

type Origin
    = Up Date
    | Down Date

现在,您可以在以前使用过的地方使用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) -> 
            "…"
相关问题