Ajout de dérivation (données) à des types standards
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:
- Comment puis-je résoudre l'erreur que je reçois avec
DiffTime
et - Quelle est la bonne façon de faire de la bibliothèque standard types sérialisables binaire Haskell?
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