La syntaxe d'enregistrement semble extrêmement pratique par rapport à l'écriture de vos propres fonctions d'accès. Je n'ai jamais vu qui que ce soit donner des directives quant à la meilleure utilisation de la syntaxe d'enregistrement par rapport à la syntaxe normale de la déclaration de données. Je vais donc demander ici.Quand dois-je utiliser la syntaxe d'enregistrement pour les déclarations de données dans Haskell?
Répondre
Vous devez utiliser la syntaxe d'enregistrement dans deux situations:
- Le type a beaucoup de champs
- La déclaration de type donne aucune indication sur sa mise en page destiné
Par exemple, un type de point peut être simplement déclaré comme:
data Point = Point Int Int deriving (Show)
Il est évident que le premier t désigne la coordonnée x et la seconde représente et. Mais le cas de la déclaration de type suivante est différent (tiré de Learn You a Haskell for Great Good):
data Person = Person String String Int Float String String deriving (Show)
La mise en page de type prévu est: prénom, nom, âge, taille, numéro de téléphone, et la saveur de crème glacée préférée. Mais ce n'est pas évident dans la déclaration ci-dessus. la syntaxe des enregistrements est à portée de main ici:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String
} deriving (Show)
La syntaxe d'enregistrement rend le code plus lisible, et enregistré beaucoup de frappe en définissant automatiquement toutes les fonctions accesseurs pour nous!
En plus des données complexes multi-champs, newtype
sont souvent définis avec la syntaxe d'enregistrement. Dans l'un ou l'autre de ces cas, il n'y a pas vraiment d'inconvénients à utiliser la syntaxe d'enregistrement, mais dans le cas des types de somme, les accesseurs d'enregistrement n'ont généralement pas de sens. Par exemple:
data Either a b = Left { getLeft :: a } | Right { getRight :: b }
est valide, mais les fonctions accesseurs sont partielle - il est une erreur d'écrire getLeft (Right "banana")
. Pour cette raison, de tels accesseurs sont généralement découragés; quelque chose comme getLeft :: Either a b -> Maybe a
serait plus commun, et cela devrait être défini manuellement. Toutefois, notez que accesseurs peuvent partager les noms:
data Item = Food { description :: String, tastiness :: Integer }
| Wand { description :: String, magic :: Integer }
Maintenant description
est totale, bien que tastiness
et magic
les deux sont toujours pas.
- 1. syntaxe dans l'expression - Haskell
- 2. quand et où mettre les déclarations @class
- 3. Les déclarations globales sont illégales dans la syntaxe Verilog 2001!
- 4. Quand les déclarations statiques sont-elles exécutées?
- 5. Quand utiliser WCF et quand utiliser les services de données ADO dans les sites Web ajax?
- 6. Utiliser les déclarations "friend" pour les tests unitaires. Mauvaise idée?
- 7. RankNTypes pour les déclarations d'instance?
- 8. Syntaxe d'enregistrement Haskell et classes de type
- 9. Utiliser Haskell pour étendre Perl?
- 10. Comment utiliser les déclarations (type, inline, optimize) dans Scheme?
- 11. Java: utiliser le polymorphisme pour éviter les déclarations if?
- 12. Quand utiliser View Preparer pour les mosaïques
- 13. simple putStrLn dans Haskell/Yampa avec la syntaxe des flèches
- 14. Quand la mémorisation est-elle automatique dans GHC Haskell?
- 15. Quand utiliser les vues de la base de données et quand?
- 16. Utiliser Haskell avec un backend de base de données pour les "applications métier"
- 17. Quand utiliser une base de données embarquée
- 18. SQL Quand utiliser quel type de données
- 19. Quand utiliser les méthodes partagées dans .NET
- 20. Quand dois-je utiliser deftype dans Clojure?
- 21. Quand dois-je utiliser les énumérations stockées dans la base de données et quand une énumération dans le code?
- 22. Quelle bibliothèque Haskell XML utiliser?
- 23. Quand utiliser POJO et Quand utiliser SLSB
- 24. Ajout de contraintes de type au contexte des déclarations d'instance dans Haskell
- 25. Comment utiliser les FFI de Haskell sur les structures?
- 26. Quand utiliser les documents incorporés?
- 27. Quand utiliser une grille et quand utiliser un répéteur sur les lignes d'une table pour afficher des données tabulaires?
- 28. Haskell: erreur de syntaxe lors de l'ajout d'une nouvelle ligne dans la correspondance de modèle
- 29. Meilleure structure de données pour plusieurs contrôles pour une variable que si les déclarations?
- 30. SharePoint UserData et la syntaxe; # dans les données renvoyées
Vous avez également une utilisation intéressante de la syntaxe d'enregistrement dans la monade 'State', où' runState' est utilisé comme un peu d'habileté syntaxique. – jberryman
Vous pouvez tirer parti de la typesystem et l'utilisation de type aliasing comme 'Type FirstName = Chaîne Type LastName = type String Âge = Int Type Hauteur = flotteur Type PhoneNumber = Chaîne Type Flavor = Chaîne données Personne = Personne FirstName Nom Age Taille PhoneNumber Flavor deriving (afficher) ' Par conséquent votre argument est invalide. – yaccz