gpt4 book ai didi

haskell - 如何处理不完整的 JSON/Record 类型(IE 缺少我稍后会填写的必填字段)?

转载 作者:行者123 更新时间:2023-12-04 12:17:42 26 4
gpt4 key购买 nike

编辑:对于那些有类似疾病的人,我发现这与“可扩展记录问题”有关,我会亲自研究更多。

EDIT2:我已经开始解决这个问题(现在几周后),我对数据类型非常明确,并且每个语义数据单元有多种数据类型。例如,如果数据库拥有 X ,我的代码有 XAction表示我想用 X 做的事情, 和 XResponse用于中继X s 到 http 客户端。然后我需要构建用于在实例之间穿梭位的支持代码。不理想,但是,我喜欢它是明确的,希望当我的模型具体化时,它不需要太多维护,并且应该非常可靠。

我不确定解决此问题的正确抽象级别是什么(即记录?或 Yesod?)所以我将仅列出简单的案例。

简单案例/TL;DR

我想将请求正文解码为一种类型
data Comment = Comment {userid :: ..., comment :: ...}
但实际上我不希望请求正文包含 userid ,服务器将根据他们的 Auth Headers 提供,(或任何我想获取数据以默认填充字段的地方)。

所以他们实际上给了我一些类似的东西:
data SimpleComment = SimpleComment {comment :: ...} deriving (Generic, FromJSON)
我把它变成了 Comment .但是同时维护这两种几乎相同的类型是一件麻烦事,而不是 DRY。

我该如何解决这个问题?

问题详情

我有一个记录类型:
data Comment = Comment {userid :: ..., comment :: ...}
我有一个 POST 路线:

postCommentR :: Handler Value
postCommentR = do
c <- requireJsonBody :: (Handler Comment)
insertedComment <- runDB ...
returnJson insertedComment

请注意,路由要求用户提供他们的 userid (在 Comment 类型中,这至少是多余的,因为他们的 id 与他们的 auth header 相关联。在最坏的情况下,这意味着我需要检查用户是否添加了他们自己的 id,或者丢弃了他们提供的 id,在这种情况下他们为什么在第一种情况下提供它。

所以,我想要一个记录类型为 Commentuserid ,但我不知道如何聪明地做到这一点。

我当前(糟糕但有效)的解决方案

所以我用派生的 FromJSON制作了一个自定义类型(对于请求正文)这与 Comment 几乎完全冗余。类型。
data SimpleComment = SimpleComment {comment :: ...} deriving (Generic, FromJSON)
那么我的新路由需要根据这个对请求体进行解码,然后合并一个 SimpleCommentuserid字段使其成为 Comment :
postComment2R :: Handler Value
postComment2R = do
c <- requireJsonBody :: (Handler SimpleComment)
(uid, _) requireAuthPair
insertedComment <- runDB $ insertEntity (Comment { commentUserid = uid
, commentComment = comment c})
returnJson ...

谈论样板。而且我的用例比这个简单的 Comment 更复杂。类型。

如果它考虑在内,您可能会说,我使用的是 Yesod脚手架 .

最佳答案

我通常做的就是得到一个类型减去一个字段,只是有一个函数来获取那个字段并返回类型。在您的情况下,您只需要为 UserId -> Comment 声明一个 JSON 实例。 .好吧,这看起来不太自然,您必须手动操作,但实际上效果很好,特别是因为 Comment 中只有一个 UserId 类型的字段。

关于haskell - 如何处理不完整的 JSON/Record 类型(IE 缺少我稍后会填写的必填字段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com