2011-05-11 1 views
4

Dire que j'ai une définition longue structure de donnéesQuelle structure de données choisir pour la généricité mais la sécurité?

data A = A { 
    x1 :: String 
, x2 :: String 
... 
, x50 :: String 
} 

Maintenant, j'ai 3 tâches:

  1. DEVENEZ projet instance de A comme A {x1 = "ceci est x1", ...}
  2. créer une instance de A partir d'une autre structure de données
  3. créer une autre instance de données depuis une instance d'un

Les trois tâches impliquent la copie inestimable des étiquettes x1, ..., x50. Une meilleure solution serait une liste générique

[ 
    Foo "x1" aValue1 
, Foo "x2" aValue2 
... 
] 

parce qu'il ferait traversal et la création d'un projet beaucoup plus facile (la définition de la liste est le projet déjà). L'inconvénient est que le mappage d'autres structures de données vers et à partir de ce serait plus dangereux, puisque vous perdez la vérification de type statique.

Est-ce que cela a du sens? Existe-t-il une solution générique mais sûre?

Modifier: Pour vous donner une meilleure idée, il s'agit de mapper des données d'entreprise à une représentation textuelle comme des formulaires et des lettres. E.g .:

data TaxData = TaxData { 
    taxId :: String 
, income :: Money 
, taxPayed :: Money, 
, isMarried :: Bool 
... 
} 


data TaxFormA = TaxFormA { 
    taxId :: Text 
, isMarried :: Text 
    ... 
} 
data TaxFormB = TaxFormB { 
    taxId :: Text 
, taxPayedRounded :: Text 
... 
} 

Ceux-ci se transforment en un flux de texte, représentant les formes réelles. Si je devais créer un formulaire à partir de données fiscales en un passage et l'année suivante, tout champ de formulaire aurait été déplacé, il y aurait par exemple. être un "0.0" errant et je ne saurais pas où il appartient. C'est à cela que sert la structure de données intermédiaire: elle facilite la création de données brouillon.

J'ai donc besoin de mapper les données fiscales réelles à ces données de formulaire intermédiaire; j'ai besoin de mapper ces données de forme à la représentation textuelle du formulaire réel; J'ai besoin de créer des brouillons de données intermédiaires. D'une part je déteste répéter ces étiquettes de données, d'autre part cela me donne une sécurité, que je ne confonds aucune étiquette lors de la cartographie. Y a-t-il une balle d'argent?

+1

Tous les éléments de la structure de données du même type (par exemple les listes) sont-ils tous distingués uniquement par leur index? Le nombre d'étiquettes est-il important? –

+0

Le nombre d'étiquettes est significatif seulement parce que je dois copier beaucoup d'étiquettes de données au moins 3 fois dans mon code. Et j'ai aussi fondamentalement besoin de répéter le nom de l'étiquette en mode brouillon. – LennyStackOverflow

+0

Comment utiliser SYB ou Uniplate? En outre, vous pourriez obtenir un certain kilométrage avec l'extension RecordWildcards dans GHC. (L'affichage d'une plus grande partie de votre programme pourrait aider ici) – aleator

Répondre

3

Les données profondément structurées comme celle-ci sont exprimées le plus idiomatiquement dans Haskell comme des types de données algébriques imbriqués, comme vous l'avez fait. Pourquoi? Il donne la plus grande structure de type et de sécurité aux données, empêchant les fonctions de mettre les données dans le mauvais format. Une nouvelle sécurité peut être obtenue en tapant certains types, afin d'augmenter les différences entre les données dans chaque domaine. Cependant, les ADT de très grande taille comme celui-ci peuvent être difficiles à nommer et manipuler. Une situation courante dans la conception de compilateurs est de spécifier un tel ADT, par exemple, et pour aider à écrire le code pour un compilateur nous avons tendance à utiliser beaucoup de trucs génériques: SYB, méta-programmation, même Template Haskell, pour générer tous les passe-partout dont nous avons besoin. Donc, en résumé, je garderais l'approche ADT que vous prenez, mais regardez en utilisant des génériques (par exemple SYB ou Template Haskell) pour générer certaines de vos définitions et fonctions d'assistance.

+0

Ok, merci, va essayer de comprendre syb. – LennyStackOverflow

Questions connexes