elm - 模式匹配标记的联合类型

标签 elm algebraic-data-types

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

type Comment = New Content | Edited Content | Flagged Content

type alias Content = {id: Int, text: String}

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

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

 filter id comment =
   case comment of
     _ content -> content.id == id

有了过滤之类的功能,这就是简单的一行重复,但是在基于状态渲染内容的时候,HTML生成逻辑的重复就比较严重了。

我知道在 Elm 中联合类型可以携带不同的“有效负载”并且编译器不喜欢通用版本,但是如果这样的话,有一些方法可以告诉编译器所有这些情况都在处理相同的记录输入?

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

最佳答案

Or is this a case of invalid use of union types and the model should be structured differently?

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

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

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


type Status
    = New
    | Edited
    | Flagged

这将使访问评论的 idtext 变得容易。如果您执行 case comment.status of ...,您仍然可以获得详尽的模式匹配的好处。

关于elm - 模式匹配标记的联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063773/

相关文章:

json - Elm:解析嵌套的 json

haskell - 有没有什么方法可以限制ADT数据,使得只有有效的数据才能被构造?

haskell - 将函数映射到代数数据类型的字段的更简洁的方法?

post - 使用 Elm 从 POST 请求下载文件

javascript - 使用 Moment.js 制作原生 ELM 模块

scala - 在函数中使用 ADT 的参数化分支

haskell - Maybe 应该用来保存错误消息吗?

types - 在 Elm 中使用数字作为类型

Elm:如何创建不返回 Msg 的 View ?