2009-12-14 6 views
4

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

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

que je fais tout cela pour aider binaire autogenerate instances 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 les types de bibliothèque standard binaire sérialisables dans Haskell?
+0

comment est '' DiffTime' importés dans TemperatureRecord'? – barkmadley

+1

ressemble à 'Data.Time.Clock' /' .Scale' n'exporte pas 'MkDiffTime', le constructeur de' DiffTime'. sans les constructeurs disponibles pour votre usage, la façon standard de dériver ne fonctionnerait pas:/ – yairchu

+0

Est-ce que cela signifie que je suis désossé? –

Répondre

4

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

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

Heureusement, cela pourrait être travaillé dans une certaine mesure. Vous pouvez extraire les données d'un DiffTime en utilisant toRational, et vous pouvez envelopper un numéro dans un DiffTime en utilisant fromRational. Il devrait donc être possible de "simuler" une instance Data avec un "faux" constructeur. Cela serait fait "manuellement" (pas de dérivation). Pour ce qui est de savoir pourquoi le constructeur de DiffTime n'est pas exposé - ce serait similaire au raisonnement derrière private dans C++ et al. Cela donne aux créateurs de DiffTime la liberté de changer son implémentation sans rien casser. En effet, s'ils changeraient la structure, ils ne casseraient pas votre "faux" Data instance et ne casseraient pas votre format de sérialisation.

-1

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)

temps Déballez cabale

changement

newtype DiffTime = MkDiffTime Pico dérivant (Eq, Ord

à

de données

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

et cabale semble fonctionner install

+0

Non. La visibilité d'un constructeur de données est déterminée par son apparence dans la liste d'exportation du module. Cela ne fait aucune différence que le type ait été déclaré avec 'data' ou' newtype'. – Will

Questions connexes