haskell - 覆盖 Haskell 中封装不良的实例

标签 haskell

我的程序依赖于一个库,该库将我提供的 JSON 解码为其内部数据类型。

该库试图封装太多内容。它隐藏了连接详细信息、数据序列化格式和幕后使用的 RPC,因此易于使用。

问题是该库拒绝我必须在我的环境中处理的 JSON。换句话说,它拒绝处理 JSON 有效负载的常见错误,例如大写/小写差异、意外但无害的 key 、可恢复的数字/字符串编码错误。

我不能依赖 newtype 技巧,因为库期望使用具体的数据类型 - 而不是我的。我需要更改它用于反序列化的“内部”类实例。

由于没有更好的想法,我 fork 了该库,并将其添加为从本地目录构建的依赖项(还必须删除所有相关的 stack 以便构建能够注意到)。

数据类型未更改,仅更改了序列化格式,从而使此更改与当前的问题隔离。

是否有更好的方法来覆盖库提供的类实例定义?

最佳答案

我已经遇到过几次类似的问题,这很烦人。如果您还没有考虑的话,可以考虑一些选项:

  1. 我们希望该库提供 Haskell 组合器来构建内部类型。然后,您可以包装该类型并提供替代的 FromJSON 实例:

    newtype WrappedT = WrappedT { toT :: Library.T }
        deriving (All, The, Classes, You, Care, About)
    
    instance FromJSON WrappedT where
        -- better instance
    
  2. 对 JSON 进行预规范化,即编写一个 JSON 到 JSON 的层来删除 Not Acceptable 位。

  3. 如果您不想维护 fork ,请将 PR 推送给作者,公开 .Internal 模块中的内部结构,然后您可以执行解决方案 1。这将保持兼容性,同时仍然允许你的改变。 (我个人也认为这样的“软封装”比更常见的“硬封装”对社区来说更好)

如果您提供问题的更多详细信息,您可能会想到其他解决方案。

关于haskell - 覆盖 Haskell 中封装不良的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749540/

相关文章:

haskell - 在 Haskell 中应用多个参数的更简单方法

haskell - 不在范围内 : type constructor or class ‘∼’

haskell - 比较列表中的所有元素 haskell

Haskell 类型错误 : Could not deduce (Show a) arising from a use of `show' from the context (Num a)

haskell - 当类型是自由变量时,实例内部类型签名中的类型类约束

haskell - 有没有办法限制可能的产品类型的实例?

algorithm - 用于排除埃拉托斯特尼筛法数字的 Haskell 代码未按预期工作

haskell - 如何测量 Haskell 程序的顺序和并行运行时间

haskell - 半组安装因 cabal 失败

haskell - 违反 if-then-else 的 Haskell 缩进规则