我正在计算一个倒数/倒计时器。设置原始日期后,计时器将显示自 - 以来经过的时间,或者保持到原始日期为止。
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 date
或Down date
。在case
表达式的第2个分支中,编译器拒绝将origin
视为比Origin
更具体的内容。
这是一个艾莉https://ellie-app.com/3zKCcX87wa1/0
我应该如何处理这样的模型?我应该以不同的方式建模吗?
答案 0 :(得分:6)
您的类型已编译,但您有两个不同的OriginDefined
定义:一个是名为OriginDefined
的类型,它有两个构造函数Up
和Down
。另一个是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) ->
"…"