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

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:

  1. Como faço para resolver o erro que eu estou ficando com DiffTime, e
  2. O que é o caminho certo para fazer tipos de biblioteca padrão serializado binário em Haskell?
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top