使用多个构造函数更新Elm记录
有没有办法修改具有多个构造函数的类型的字段使用多个构造函数更新Elm记录,elm,Elm,有没有办法修改具有多个构造函数的类型的字段 type U = S | C { xxx : String } This is not a record, so it has no fields to update! 5| let c = C { xxx = "DD"} in case c of C {} -> { c | xxx = "ZZ" }
type U = S | C { xxx : String }
This is not a record, so it has no fields to update!
5| let c = C { xxx = "DD"} in case c of C {} -> { c | xxx = "ZZ" }
^
This `c` value is a:
U
But I need a record!
在
type U=S|C{xxx:String}
中,xxx
不是U
的字段。它是C
中包含的记录字段。这些是可以分解为单独值的单独类型。实现这一点的方法是使用case
匹配C
构造函数,并将包含的值绑定到一个名称(或进一步解构),以便我们可以在->
的右侧引用它
但是,您还需要处理c
成为S
的可能性。那么应该退还什么呢?也许是违约?或者你真的想返回一个U
?我在这里假设了前者,但后者只是U
的构造值,就像在其他任何地方一样
let
c =
C { xxx = "DD" }
in
case c of
C record ->
{ record | xxx = "ZZ" }
S ->
-- What to do here?
{ xxx = "default?" }
我理解榆树的抱怨,我需要一个解决办法。TypeScript和Kotlin可以从if条件中获益,以缩小类型。Haskell具有模式别名功能。