将派生(数据)添加到标准类型

时间:2009-12-14 03:33:54

标签: haskell typeclass

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

deriving instance Data Day => Data (Day)

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

TemperatureRecord.hs:30:0:
    The data constructors of `DiffTime' are not all in scope
      so you cannot derive an instance for it
    In the stand-alone deriving instance for
      `(Data DiffTime) => Data (DiffTime)'

我正在做这一切以帮助自动生成标准类型的二进制实例。所以我有两个问题:

  1. 如何使用DiffTime
  2. 解决错误
  3. 在Haskell中使标准库类型二进制可序列化的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

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

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

幸运的是,这可以在某种程度上解决。您可以使用DiffTimetoRational中提取数据,然后使用DiffTime将数字打包到fromRational。因此,应该可以使用“假”构造函数“伪造”Data实例。这将“手动”完成(无需派生)。

至于DiffTime的构造函数未暴露的原因 - 这与C ++等人private背后的推理类似。这使DiffTime的创建者可以自由地改变其实现而不会破坏任何内容。实际上,如果他们改变结构,它不会破坏你的“假”Data实例,也不会破坏你的序列化格式。

答案 1 :(得分:-1)

我是一个haskell newb,但我认为你可以这样做来暴露构造函数(从而自动派生数据)

  

cabal解压缩时间

变化

  

newtype DiffTime = MkDiffTime微微推导(Eq,Ord

  

数据DiffTime = MkDiffTime微微推导(Eq,Ord

并且cabal安装似乎正常工作

相关问题