使用多个构造函数更新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具有模式别名功能。