我想将 deriving (Data)
添加到标准类型。启用 StandaloneDeriving
、 FlexibleContexts
、 DeriveDataTypeable
和 UndecidableInstances
扩展后,ghc 接受
deriving instance Data Day => Data (Day)
但是,如果我对
DiffTime
做同样的事情,我会得到温度记录.hs:30:0:
`DiffTime' 的数据构造函数并不都在范围内
所以你不能为它派生一个实例
在独立派生实例中
`(数据差异时间)=> 数据(差异时间)'
我这样做是为了帮助自动生成标准类型的二进制实例。所以我有两个问题:
DiffTime
和 最佳答案
time
包不公开 MkDiffTime
, DiffTime
的构造函数。
要创建 Data
实例,您通常会使用类型的构造函数。即使您自动派生它,派生实例也会这样做。
幸运的是,这在某种程度上是可以解决的。您可以使用 DiffTime
从 toRational
中提取数据,也可以使用 DiffTime
将数字包装在 fromRational
中。所以应该可以用“假”构造函数“假”一个 Data
实例。这将“手动”完成(没有推导)。
至于为什么不公开 DiffTime
的构造函数 - 这类似于 C++ 等人中 private
背后的推理。这使 DiffTime
的创建者可以在不破坏任何内容的情况下自由更改其实现。事实上,如果他们改变结构,它不会破坏你的“假” Data
实例,也不会破坏你的序列化格式。
关于haskell - 将派生(数据)添加到标准类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1898771/