首页 > 解决方案 > 使用多个构造函数更新 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" } 
                                                    ^
This `c` value is a:

    U

But I need a record!

标签: elm

解决方案


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?" }

推荐阅读