2009-12-14 18 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