Question

Je voudrais ajouter deriving (Data) aux types standard. Après avoir activé les StandaloneDeriving, FlexibleContexts, DeriveDataTypeable et extensions de UndecidableInstances, GHC accepte

deriving instance Data Day => Data (Day)

Cependant, si je fais la même chose pour DiffTime je reçois

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)'

Je fais tout cela pour aider AutoGenerate instances binaires de types standard. J'ai donc deux questions:

  1. Comment puis-je résoudre l'erreur que je reçois avec DiffTime et
  2. Quelle est la bonne façon de faire de la bibliothèque standard types sérialisables binaire Haskell?
Était-ce utile?

La solution

Le paquet time ne pas exposer MkDiffTime, constructeur de DiffTime.

Pour créer une instance de Data, vous le feriez normalement travailler avec les constructeurs du type. Même si vous dérivez automatiquement, c'est ce que l'instance dérivée ferait aussi bien.

Par chance, cela pourrait être contourné, dans une certaine mesure. Vous pouvez extraire les données à partir d'un DiffTime en utilisant toRational, et vous pouvez envelopper un numéro dans un DiffTime en utilisant fromRational. Ainsi, il devrait être possible de « faux » une instance de Data avec un constructeur « faux ». Cela serait fait « manuellement » (pas de dérivation).

Quant à savoir pourquoi le constructeur de DiffTime n'est pas exposé - ce serait semblable au raisonnement derrière private en C ++ et al. Cela donne aux créateurs de DiffTime la liberté de changer sa mise en œuvre sans casser quoi que ce soit. En effet, si elles changeraient la structure, il ne cassera pas votre instance de Data « faux » et ne cassera pas votre format de sérialisation.

Autres conseils

Je suis un newb haskell, mais je pense que vous pouvez le faire pour exposer le constructeur (et donc des données dérivées automatiquement)

  

cabale temps Déballez

changement

  

newtype = Taille, Heure Différente MkDiffTime Pico dériver (Eq, Ord

à

  

= données Taille, Heure Différente MkDiffTime Pico dériver (Eq, Ord

et cabale installer semble fonctionner

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top