2009-12-14 73 views
4

我想添加deriving (Data)到标准类型。使StandaloneDerivingFlexibleContextsDeriveDataTypeable,并且UndecidableInstances扩展后,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. 是什么力量让标准库类型在Haskell二进制序列化的正确方法?
+0

如何'DiffTime'导入'TemperatureRecord'? – barkmadley 2009-12-14 04:06:46

+1

看起来像'Data.Time.Clock' /'.Scale'不会导出'DiffTime'的构造函数'MkDiffTime'。没有可供您使用的构造函数,标准派生方法将不起作用:/ – yairchu 2009-12-14 22:09:19

+0

这是否意味着我骨架? – 2009-12-15 00:02:37

回答

4

time包不公开MkDiffTime,DiffTime的构造函数。

要创建一个Data实例,您通常会使用该类型的构造函数。即使你自动派生它,这也是派生实例的功能。

幸运的是,这可以在一定程度上解决。您可以使用toRationalDiffTime中提取数据,并且您可以使用fromRational将数字包装在DiffTime中。所以应该可以用一个“假”构造函数来“伪造”一个Data实例。这将“手动”(不派生)完成。

至于为什么DiffTime的构造函数没有暴露 - 这与C++等人的private背后的推理类似。这使得DiffTime的创建者可以自由地更改其实现而不会破坏任何内容。的确,如果他们改变结构,它不会破坏你的“假”实例,并且不会破坏你的序列化格式。

-1

我是一个Haskell福利局,但我认为你可以做到这一点,露出的构造函数(并由此自动获得的数据)

阴谋解压时间

变化

新类型DiffTime = MkDiffTime微微推导(Eq,Ord

数据DiffTime = MkDiffTime微微得出(公式,奥德

和小集团安装似乎工作

+0

没有。数据构造函数的可见性由其在模块的导出列表中的外观决定。不管类型是用'data'还是'newtype'声明都没有区别。 – Will 2013-12-30 21:30:19