我想将 deriving (Data) 添加到标准类型。启用 StandaloneDerivingFlexibleContextsDeriveDataTypeableUndecidableInstances 扩展后,ghc 接受

deriving instance Data Day => Data (Day)

但是,如果我对 DiffTime 做同样的事情,我会得到

温度记录.hs:30:0:
`DiffTime' 的数据构造函数并不都在范围内
所以你不能为它派生一个实例
在独立派生实例中
`(数据差异时间)=> 数据(差异时间)'

我这样做是为了帮助自动生成标准类型的二进制实例。所以我有两个问题:
  • 如何解决使用 DiffTime
  • 遇到的错误
  • 在 Haskell 中使标准库类型二进制可序列化的正确方法是什么?
  • 最佳答案

    time 包不公开 MkDiffTimeDiffTime 的构造函数。

    要创建 Data 实例,您通常会使用类型的构造函数。即使您自动派生它,派生实例也会这样做。

    幸运的是,这在某种程度上是可以解决的。您可以使用 DiffTimetoRational 中提取数据,也可以使用 DiffTime 将数字包装在 fromRational 中。所以应该可以用“假”构造函数“假”一个 Data 实例。这将“手动”完成(没有推导)。

    至于为什么不公开 DiffTime 的构造函数 - 这类似于 C++ 等人中 private 背后的推理。这使 DiffTime 的创建者可以在不破坏任何内容的情况下自由更改其实现。事实上,如果他们改变结构,它不会破坏你的“假” Data 实例,也不会破坏你的序列化格式。

    关于haskell - 将派生(数据)添加到标准类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1898771/

    10-10 07:16