Multiversion API实施

时间:2018-01-08 13:55:48

标签: haskell

如果我有一个库来实现某些REST服务的API(在几个模块中:类型+ API调用+ JSON实例......),那么实现新API支持的最佳(和方便?)方式是什么(版本2) )?要创建全新的图书馆?但是大多数代码是相同的,JSON实例中有一些重大变化,API调用是相同的,类型大多是相同的。在这种情况下,常见代码中的任何错误都必须“修复”#34;两次:在两个库中(这也涉及两个库中的测试修改)。如何"取代"只有实例?在ML和F#中可以进行这种灵活的模块修改,但我没有找到在Haskell中执行此操作的方法:仅导入类型,不使用其实例并为其重新创建新实例导致重复实例的错误(尽管实例未导出和导入)。那么,什么是正确的,最好的是创建新的API而不重复代码? PS。客户将同时使用两个版本

1 个答案:

答案 0 :(得分:4)

这似乎是backpack的用例。将每个版本的两个版本之间的类型和实例分开,并针对公共接口编写项目的其余部分,可以实例化两次,类似于ML仿函数。

如果您不想复制类型声明,我不确定它是否会正常工作,但也许您可以在公共库中声明类型为Version的幻像参数的类型:

data Version = V1 | V2

data MyData (v :: Version) = ...
data MyData2 (v :: Version) = C X Y (MyData v) | ...

并且有两个库分别为MyData V1MyData V2声明了孤立实例。

  

仅导入类型,没有其实例

实例始终是导出的,无法隐藏,这就是Haskell的类型类系统如何工作以确保一致性(尽可能)。我上面的建议介绍了两种不相交类型MyData V1MyData V2的实例,同时可以自由地从一种类型强制转换为另一种类型。