En Elm, un registro es una colección de pares clave = valor, similar a un objeto en otros lenguajes, pero inmutable y tipado.
Son muy usados para agrupar datos de manera clara y segura.
persona : { nombre : String, edad : Int }
persona =
{ nombre = "Ana", edad = 30 }
- nombre es de tipo String.
- edad es de tipo Int.
nombreDeAna : String
nombreDeAna =
persona.nombre
-- Resultado: "Ana"
También se puede usar una función anónima para acceder:
List.map .nombre [ persona, { nombre = "Luis", edad = 25 } ]
-- ["Ana", "Luis"]
Los registros en Elm son inmutables.
Para "cambiar" un campo, se crea una copia con el campo modificado:
personaMayor : { nombre : String, edad : Int }
personaMayor =
{ persona | edad = 31 }
Esto no altera persona, sino que genera un nuevo registro.
Las funciones pueden recibir registros directamente:
saludar : { nombre : String } -> String
saludar r =
"Hola, " ++ r.nombre
saludar persona
-- "Hola, Ana"
Cuando un registro es usado en varios lugares, conviene definir un alias de tipo:
type alias Persona =
{ nombre : String
, edad : Int
}
juan : Persona
juan =
{ nombre = "Juan", edad = 40 }
cumplirAnios : Persona -> Persona
cumplirAnios p =
{ p | edad = p.edad + 1 }
Podemos "abrir" un registro en sus campos:
mostrar : Persona -> String
mostrar { nombre, edad } =
nombre ++ " tiene " ++ String.fromInt edad ++ " años"
mostrar juan
-- "Juan tiene 40 años"
En Resumen:
- Un registro agrupa datos con nombres de campo.
- Son inmutables, para "modificarlos" se usa la sintaxis { r | campo = nuevoValor }.
- Los alias de tipo (type alias) hacen el código más claro.
- Se puede usar desestructuración para acceder fácilmente a los campos.
En Elm, los registros reemplazan el concepto de objetos de otros lenguajes, pero sin herencia ni mutabilidad.