我有一个包含一些记录数据的标记联合类型,例如
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
这将使访问评论的 id
和 text
变得容易。如果您执行 case comment.status of ...
,您仍然可以获得详尽的模式匹配的好处。
关于elm - 模式匹配标记的联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063773/