使用单个构造函数联合类型

Using a single constructor union type

在 Elm 中,有时我发现自己通过使用只有一个构造函数的联合类型来定义记录类型。然后我使用只有一个案例的案例陈述来解压记录字段:

type Model =
    Model { stack: List Int }

update msg model =
    case model of
        Model { stack } ->
            ...

有没有更短的解压方法?单例案例看起来有点傻。它会导致不必要的缩进和冗长。

此外:我使用 type 而不是 type alias 来更明确地处理程序中的中央数据结构(它往往有几个字段并且仅用于程序中的几个地方,所以额外的冗长并不是那个的大问题)。放弃这种方法并尽可能为记录使用类型别名会更好吗?

您可以在函数签名本身中进行模式匹配:

update msg (Model model) =
    model.stack ...

或者,如果您想直接使用 stack

update msg (Model { stack }) =
    ...

至于你应该做这种事吗?我过去曾在明确尝试从模型中隐藏实现细节时使用过它。你只需要愿意处理它不可避免地引入的额外冗长。真的由您决定是否有必要。除非有明确的需要,否则我可能会倾向于避免使用它。