haskell - 多版本API实现

标签 haskell

如果我有一个为某些 REST 服务实现 API 的库(在多个模块中:类型+API 调用+JSON 实例...),实现对新 API(版本 2)的支持的最佳(且方便?)方法是什么)?创建全新的图书馆?但大部分代码是相同的,JSON 实例中有一些重大更改,API 调用是相同的,类型大多是相同的。在这种情况下,公共(public)代码中的任何错误都必须“修复”两次:在两个库中(这也涉及两个库中的测试修改)。如何仅“替换”实例?这种灵活的模块修改在 ML 和 F# 中是可能的,但我没有找到在 Haskell 中做到这一点的方法:仅导入类型,不包含其实例并为其重新创建新实例会导致有关重复实例的错误(尽管实例不导出和导入)。那么,正确且最好的做法是创建新的 API,而不需要大量重复代码?附言。客户端将同时使用两个版本

最佳答案

这似乎是 backpack 的一个用例。将每个版本的两个版本之间发生变化的类型和实例分离到一个库中,并根据通用接口(interface)编写项目的其余部分,您可以实例化两次,类似于 ML 仿函数。

如果您不想重复类型声明,我不确定它是否能正常工作,但也许您可以在公共(public)库中使用 Version 类型的幻像参数来声明类型:

data Version = V1 | V2

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

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

importing of type only, w/o its instances

实例总是被导出并且不能被隐藏,这就是 Haskell 的类型类系统如何确保一致性(在可能的范围内)。我上面的建议引入了两种不相交类型 MyData V1MyData V2 的实例,同时可以自由地从一种类型强制到另一种类型。

关于haskell - 多版本API实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151769/

相关文章:

haskell - 为什么这个 Haskell 代码可以成功地处理无限列表?

Haskell Cabal 包含静态库

Haskell: 'tell ["abc“]' evaluation throwing "非类型变量参数”错误

haskell - Haskell 中签名的实现

haskell - Clojure 是否有类似于 Haskell 的美元符号的运算符?

haskell - Yesod 静态文件类型安全路由变量不在范围内

haskell - Haskell parMap 中的共享变量

haskell - 如何显示 cabal 项目的依赖关系树

haskell - 在 Haskell 中实现 liftM2

haskell - haskell中类型的函数应用程序操作数($)?