我正在用Haskell创建一个相当简单的CRUD web服务,使用Warp (可能还有Scotty)和acid-state。
在acid状态下,我将用户记录存储在一个Data.Map中(根据this示例)。我知道这些记录在创建时总是完整的,所以我不需要使用很多MaybeS。但是,在更新用户时,客户端可能会选择发送部分json对象,其中只填充了一些字段。
表达这一点的惯用方式是什么?我是否应该有一个数据声明,FullUser,不带MaybeS,并且在所有可选键PartialUser前面有一个与MaybeS完全相同的数据声明,并让PartialUser自动为后者派生编码和解码,最后编写我自己的类型为::FullUser -> PartialUser -> FullUser的更新函数?
它不会有太多的代码,但它感觉有点丑陋,看起来有点违反DRY。这在web服务器中应该是一个很常见的任务,所以可能已经通用地解决了(可能是用
我意识到我可以只存储json字符串并总是检查缺少的键,这使得它稍微有点笨拙,但更适合模式更改,但我仍然想知道如何以一种“类型安全”的方式做到这一点。
编辑:或者我应该只使用FullUser,并使用aeson-lens从FullUser和json字符串编写一个简单的更新函数?
发布于 2013-03-05 05:21:03
惯用的Haskell正在做尽可能多的静态检查。您应该始终从是否可以用静态检查替换动态检查的角度来处理您的问题。这就是为什么下面关于Haskell的陈述非常接近现实:“如果它编译了,它就能工作”。因此,使用纯JSON肯定是一个“不”。
您使用FullUser和PartialUser的解决方案是正确的。虽然我会建议采用不同的命名方法:User和UserJSON -这样你就会得到一个相当描述性和合理的含义。
然而,伊森有一个小问题:生成的实例don't yet support parsing missing fields (请对该问题进行投票)。因此,您必须手动定义实例。
https://stackoverflow.com/questions/15209915
复制相似问题