模式匹配标记联合类型

kas*_*tti 3 algebraic-data-types elm

我有一个标记的联合类型,其中包含一些记录数据,例如

type Comment = New Content | Edited Content | Flagged Content

type alias Content = {id: Int, text: String}
Run Code Online (Sandbox Code Playgroud)

Comment类型声明的状态。

例如,当使用模式匹配按 id 过滤时,我必须写

filter Int -> Comment -> Bool
filter id comment =
  case comment of
    New content -> content.id == id
    Edited content -> content.id == id
    Flagged content -> content.id = id
Run Code Online (Sandbox Code Playgroud)

这有效,但我必须为每种情况复制相同的逻辑,而我希望它简单

 filter id comment =
   case comment of
     _ content -> content.id == id
Run Code Online (Sandbox Code Playgroud)

有了过滤等功能,这是简单的一行复制,但是在基于状态渲染内容时,HTML生成逻辑的复制更加严重。

我知道在 Elm 联合类型中可以携带不同的“有效载荷”并且编译器不喜欢通用版本,但是在这种情况下,有没有办法告诉编译器所有这些情况都在处理相同的记录类型?

或者这是无效使用联合类型的情况并且模型应该以不同的方式构造?也许状态是记录类型的一部分。

Dog*_*ert 5

或者这是无效使用联合类型的情况并且模型应该以不同的方式构造?

如果所有三个变体将始终包含相同的数据,那么是的。

我会在顶部使用一条记录,并为评论的“状态”创建一个标记联合。

type alias Comment =
    { id : Int
    , text : String
    , status : Status
    }


type Status
    = New
    | Edited
    | Flagged
Run Code Online (Sandbox Code Playgroud)

这将使访问idtext评论变得容易。如果你这样做,你仍然会得到详尽的模式匹配的好处case comment.status of ...