我有一种代表持久记录的类型。我想要一个非常相似的类型来表示应该发布以创建新记录的数据。
这是完整的类型:
data Record = Reading
{ id: UUID
, value: String
...
}
“新”类型与减去“id”相同,该“id”将由数据库自动生成。我如何定义这个类型?我正在使用servant 来定义API。
我当前的策略是在类型和所有字段前加上“new”前缀,这有效,但对于多字段模型来说是多余的。我还看到了嵌套策略,其中我有一个共同的共享类型。我也考虑过将 id 设为可选,但我真的不想发布它。
您可以使用更高种类的数据之类的方法来实现这一点。
首先,一些进口:
然后,定义具有更高种类类型参数的记录:
Functor为您提供了该
Identity
记录的一个变体,它始终有一个 Id。使用
Maybe
给你一个带有可选id的变体。Proxy
可以用作具有单个无趣“单位”值的函子。(并且没有包装类型的值)。Record
这让我们可以为没有 ID 的对象创建一个类型。我们可以导出
Show
我们的Record
.需要在实例中传递
omitNothingFields = True
and才能按照您的预期解析 a 。这确实需要 Aeson >= 2.2.0.0 的版本(在撰写本文时该版本比最新的 Stackage Snapshot 更新)。如果此版本绑定不适合您,您可以手动实现 Aeson 实例。allowOmitedFields = True
Aeson
RecordWithoutId
使用 ID 对值进行编码:
对没有 ID 的值进行编码:
解码没有 ID 的值