La sintassi della registrazione sembra estremamente comoda rispetto alla necessità di scrivere le proprie funzioni di accesso. Non ho mai visto nessuno dare delle linee guida su quando è meglio usare la sintassi del record sulla normale sintassi della dichiarazione dei dati, quindi mi limiterò a chiedere qui.Quando dovrei usare la sintassi del record per le dichiarazioni di dati in Haskell?
risposta
Si dovrebbe usare la sintassi di registrazione in due situazioni:
- Il tipo ha molti campi
- La dichiarazione del tipo dà alcun indizio circa il suo layout destinato
Per esempio un tipo di punto può essere semplicemente dichiarato come:
data Point = Point Int Int deriving (Show)
È ovvio che il primo t indica la coordinata x e la seconda sta per y. Ma il caso con la seguente dichiarazione di tipo diverso (tratto da Learn You a Haskell for Great Good):
data Person = Person String String Int Float String String deriving (Show)
Il layout tipo previsto è: nome, cognome, età, altezza, numero di telefono, e favorito il sapore di gelato. Ma questo non è evidente nella dichiarazione di cui sopra. sintassi Record viene portata di mano qui:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String
} deriving (Show)
La sintassi verbale reso il codice più leggibile, e salvato una grande quantità di battitura definendo automaticamente tutte le funzioni di accesso per noi!
Oltre ai dati complessi a più campi, i valori di newtype
vengono spesso definiti con la sintassi del record. In nessuno di questi casi, non ci sono davvero dei lati negativi nell'usare la sintassi dei record, ma nel caso dei tipi di somma, i metodi di accesso ai record di solito non hanno senso. Ad esempio:
data Either a b = Left { getLeft :: a } | Right { getRight :: b }
è valido, ma le funzioni di accesso sono parziale - è un errore di scrivere getLeft (Right "banana")
. Per questo motivo, tali utenti sono generalmente scoraggiati; qualcosa come getLeft :: Either a b -> Maybe a
sarebbe più comune e dovrebbe essere definito manualmente. Si noti tuttavia che di accesso possono condividere nomi:
data Item = Food { description :: String, tastiness :: Integer }
| Wand { description :: String, magic :: Integer }
Ora description
è totale, anche se tastiness
e magic
entrambi ancora non lo sono.
- 1. Quando dovrei usare la sintassi "(function() {...})();"?
- 2. Esistono utili astrazioni per la sintassi del record di Haskell?
- 3. Quando dovrei usare AQL?
- 4. Quando dovrei usare deftype in Clojure?
- 5. Quando dovrei usare # in ColdFusion?
- 6. Quando non dovrei usare le espressioni regolari?
- 7. Quando dovrei usare CompiledQuery?
- 8. Quando dovrei usare Sql Azure e quando dovrei usare la tabella Storage?
- 9. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 10. Quando dovrei usare l'inizializzazione uniforme?
- 11. Quando dovrei usare le parentesi nelle istruzioni require/include?
- 12. Quando dovrei usare ConcurrentSkipListMap?
- 13. Dichiarazioni di controllo in Haskell?
- 14. Quando dovrei usare le proprietà di dipendenza in WPF?
- 15. Quando dovrei usare setUserState in Joomla?
- 16. Quando/Perché dovrei usare Multithread in Java?
- 17. Quale struttura dati dovrei usare per la classe BigInt
- 18. Quando dovrei usare git stash?
- 19. Uso della sintassi dell'aggiornamento del record con record GADT vincolati
- 20. Quando dovrei usare package-private in Java?
- 21. Quale database dovrei usare per memorizzare i record e come dovrei usarlo?
- 22. Proposta per dichiarazioni/istanze di dati locali
- 23. Quando dovrei usare simultaneamente in golang?
- 24. Quando dovrei usare C++ anziché SQL?
- 25. Quando dovrei usare l'Interface Builder?
- 26. Perché dovrei usare le classi in python?
- 27. Quando dovrei usare tipi di record avanzati in Delphi invece di classi?
- 28. Quando dovrei usare un parser?
- 29. Quando dovrei usare setUpClass e quando __init__?
- 30. Quando dovrei usare require() e quando usare define()?
Hai anche un uso interessante della sintassi del record nella monade 'State', dove' runState' è usato come un po 'di intelligenza sintattica. – jberryman
Si potrebbe sfruttare il sistema dei tipi e l'uso di tipo aliasing come 'tipo FirstName = Stringa Tipo Cognome = Stringa tipo Età = Int tipo Altezza = Float tipo PhoneNumber = Stringa tipo Sapore = Stringa persona dati = persona FirstName LastName Età Altezza PhoneNumber Sapore derivante (mostra) ' Pertanto il tuo argomento non è valido. – yaccz