我想将deriving (Data)
添加到标准类型中。启用StandaloneDeriving
,FlexibleContexts
,DeriveDataTypeable
和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)'
我正在做这一切以帮助自动生成标准类型的二进制实例。所以我有两个问题:
DiffTime
和答案 0 :(得分:4)
time
包不会公开MkDiffTime
,DiffTime
的构造函数。
要创建Data
实例,通常可以使用类型的构造函数。即使您自动派生它,也就是派生实例也会这样做。
幸运的是,这可以在某种程度上解决。您可以使用DiffTime
从toRational
中提取数据,然后使用DiffTime
将数字打包到fromRational
。因此,应该可以使用“假”构造函数“伪造”Data
实例。这将“手动”完成(无需派生)。
至于DiffTime
的构造函数未暴露的原因 - 这与C ++等人private
背后的推理类似。这使DiffTime
的创建者可以自由地改变其实现而不会破坏任何内容。实际上,如果他们改变结构,它不会破坏你的“假”Data
实例,也不会破坏你的序列化格式。
答案 1 :(得分:-1)
我是一个haskell newb,但我认为你可以这样做来暴露构造函数(从而自动派生数据)
cabal解压缩时间
变化
newtype DiffTime = MkDiffTime微微推导(Eq,Ord
到
数据DiffTime = MkDiffTime微微推导(Eq,Ord
并且cabal安装似乎正常工作