设计RPC库时,如何允许用户更改序列化格式?

时间:2018-12-13 18:44:51

标签: haskell

我觉得类型类实例只有在有一个有效的实现时才应定义,而序列化不是其中一种。

主要是因为序列化是IO的网关,而事情发生在另一端。

因此,假设我想创建一个方便库来解析来自某些外部服务提供商的JSON输入。如果提供程序突然更改了语法,我如何允许用户调整格式?

我认为一般的答案是让用户“传递功能记录”。 但是派生的FromJSON实例非常方便!

拥有FromJSON实例是件好事吗?我的图书馆应该使用它吗?由于实例是全局的,我担心实例“泄漏”。我可以不导出它,但仍为用户提供默认序列化吗?

1 个答案:

答案 0 :(得分:1)

外部服务提供商在不更改语义的情况下更改其JSON格式的可能性有多大?如果由于字段更多/更少而需要编写新的Haskell类型,那么我有一个新类型,可以添加新的JSON实例。

如果这种更改很少见,那么多数时候仍然值得为实例导向的解决方法带来便利。当我必须具有新功能并且您尚未更新库时,偶尔可以在几周内为您提供库或提供新类型。

如果您不想让JSON实例规范化,但仍然希望方便的Template Haskell派生函数,我相信mkJSONmkParseJSON会生成实现,您可以像平常一样导出功能。

我总是很欣赏同时提供接口的类型类定向版本和带有显式函数参数版本的库。