Adição de derivação (dados) de tipos padrão
Pergunta
Eu gostaria de adicionar deriving (Data)
aos tipos de padrão. Depois de ativar os StandaloneDeriving
, FlexibleContexts
, DeriveDataTypeable
e extensões UndecidableInstances
, ghc aceita ??p>
deriving instance Data Day => Data (Day)
No entanto, se eu fizer a mesma coisa para DiffTime
I get
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)'
Eu estou fazendo tudo isso para ajudar AutoGenerate casos binárias de tipos convencionais. Então, eu tenho duas perguntas:
- Como faço para resolver o erro que eu estou ficando com
DiffTime
, e - O que é o caminho certo para fazer tipos de biblioteca padrão serializado binário em Haskell?
Solução
O pacote time
não expõe MkDiffTime
, construtor de DiffTime
.
Para criar uma instância Data
, você normalmente trabalhar com construtores do tipo. Mesmo se você está derivando-lo automaticamente, isso é o que a instância derivada faria bem.
Felizmente, isso pode ser contornado, em certa medida. Você pode extrair os dados de um DiffTime
usando toRational
, e você pode envolver um número em um DiffTime
usando fromRational
. Por isso, deve ser possível "fake" uma instância Data
com um construtor "fake". Isso seria feito "manualmente" (sem derivação).
Como a razão pela qual o construtor de DiffTime
não está exposta - este seria semelhante ao raciocínio por detrás private
em C ++ et al. Isto dá aos criadores de DiffTime
a liberdade de mudar a sua implementação sem quebrar nada. Na verdade, se eles iriam mudar a estrutura, não vai quebrar o seu "fake" instância Data
e não vai quebrar o seu formato de serialização.
Outras dicas
Eu sou um newb Haskell, mas acho que você pode fazer isso para expor o construtor (e, assim, automaticamente derivado de dados)
cabal tempo descompactar
mudança
Newtype difftime = MkDiffTime Pico derivando (Eq, Ord
para
= dados difftime MkDiffTime Pico derivação (Eq, Ord
e Cabal instalar parece funcionar