La sintaxis de registro parece extremadamente conveniente en comparación con tener que escribir sus propias funciones de acceso. Nunca he visto a nadie dar pautas sobre cuándo es mejor utilizar la sintaxis del registro en lugar de la sintaxis normal de declaración de datos, así que solo preguntaré aquí.¿Cuándo debería usar la sintaxis de registro para las declaraciones de datos en Haskell?
Respuesta
Se debe utilizar la sintaxis de registro en dos situaciones:
- El tipo tiene muchos campos
- La declaración de tipo no da ninguna pista sobre su trazado previsto
Por ejemplo, un tipo de punto se pueden simplemente declarado como:
data Point = Point Int Int deriving (Show)
Es obvio que el primero En t denota la coordenada x y la segunda significa y. Pero el caso con la siguiente declaración de tipo es diferente (tomado de Learn You a Haskell for Great Good):
data Person = Person String String Int Float String String deriving (Show)
El diseño tipo previsto es: nombre, apellido, edad, altura, número de teléfono, y el sabor favorito de helado. Pero esto no es evidente en la declaración anterior. la sintaxis de registro es muy útil aquí:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String
} deriving (Show)
La sintaxis de registro hizo que el código sea más legible, y se guarda una gran cantidad de tipificación definiendo automáticamente todas las funciones de acceso para nosotros!
Además de los datos complejos de múltiples campos, newtype
s a menudo se definen con sintaxis de registro. En cualquiera de estos casos, no hay inconvenientes en el uso de la sintaxis de registros, pero en el caso de los tipos de suma, los accesadores de registros generalmente no tienen sentido. Por ejemplo:
data Either a b = Left { getLeft :: a } | Right { getRight :: b }
es válida, pero las funciones de acceso son parcial - es un error de escribir getLeft (Right "banana")
. Por esa razón, en general se desaconseja dicho acceso; algo como getLeft :: Either a b -> Maybe a
sería más común, y eso tendría que definirse manualmente. Sin embargo, tenga en cuenta que descriptores de acceso pueden compartir nombres:
data Item = Food { description :: String, tastiness :: Integer }
| Wand { description :: String, magic :: Integer }
Ahora description
es total, aunque tastiness
y magic
ambos todavía no lo son.
- 1. ¿Cuándo debería usar closeCursor() para las declaraciones PDO?
- 2. ¿Cuándo debería usar la sintaxis "(function() {...})();"?
- 3. Sintaxis del registro de Haskell
- 4. ¿Cuándo * no * usar declaraciones preparadas?
- 5. ¿Cuándo debería usar std_logic_vector y cuándo debería usar otros tipos de datos?
- 6. ¿Cuándo debería usar _aligned_malloc()?
- 7. ¿Cuándo debería usar deftype en Clojure?
- 8. ¿Cuándo debería usar semáforos?
- 9. ¿Cuándo debería usar paréntesis en las instrucciones require/include?
- 10. ¿Cuándo debería usar transacciones en mis consultas?
- 11. ¿Cuándo debería usar # en ColdFusion?
- 12. ¿Cuándo debería usar CompiledQuery?
- 13. ¿Cuándo debería usar ConcurrentSkipListMap?
- 14. C#: ¿Cuándo debería usar TryParse?
- 15. Cuándo debería usar SynchronousQueue
- 16. ¿Cuándo debería usar GC.SuppressFinalize()?
- 17. ¿Cuándo debería usar LINQ para C#?
- 18. ¿Cuándo debería usar una base de datos de objetos?
- 19. ¿Cuándo debería usar stdClass y cuándo debería usar una matriz en php oo?
- 20. ¿Cuándo debería usar AUTOLOAD de Perl? En
- 21. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 22. ¿Cuándo debería usar la indexación de texto completo?
- 23. Debería hasOwnProperty seguir utilizándose para ... en las declaraciones
- 24. ¿Cuándo debería usar Microdatos HTML5 para SEO?
- 25. ¿Cuándo debería usar html5 sessionStorage?
- 26. Haskell sintaxis de registro y clases de tipo
- 27. ¿Cuándo debería usar Silverlight y cuándo XNA?
- 28. ¿Cuándo debería usar un gestor de scripts?
- 29. ¿Cuándo debería usar require() y cuándo usar define()?
- 30. ¿Cuándo debería usar un analizador?
También tiene un uso interesante de la sintaxis de registros en la mónada 'State', donde' runState' se usa como un poco de astucia sintáctica. – jberryman
Se podría aprovechar el sistema de tipos y el uso de tipo aliasing como 'Tipo Nombre = Cadena tipo Apellido = cadena tipo Edad = Int tipo Altura = Float tipo Fax = cadena tipo Sabor = cadena Persona datos = Persona FirstName LastName Edad Altura PhoneNumber Flavor deriving (mostrar) ' Por lo tanto, su argumento no es válido. – yaccz