Un registro es una colección de campos (que pueden ser de diferentes tipos) que van juntos. Para definir un registro se usa la palabra clave type. Los campos de un registro se definen entre los caracteres { y }, y cada campo tiene un nombre y un tipo. Para crear un registro, especifica los nombres de los campos y asígnales un valor entre los caracteres { y }. Todos los campos deben tener un valor asignado al crear un registro. Se puede acceder a los valores de los campos de una instancia de registro usando la notación de punto.
Al definir o crear un registro, cada campo debe ir en una línea separada o, cuando varios campos comparten una línea, deben separarse con punto y coma (;).
// Define a record
type Address =
{ Street: string
HouseNumber: int }
// Create a record
let oldAddress: Address =
{ Street = "Main Street"
HouseNumber = 17 }
// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }
Como los registros son inmutables, una vez que se ha construido un registro, los valores de sus campos nunca pueden cambiar. Si quieres cambiar los valores de un registro, la palabra clave with te permite crear una copia de un registro existente, pero con valores nuevos para uno o más campos.
// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street // => "Main Street"
newAddress.HouseNumber // => 86
Los registros tienen igualdad estructural, lo que significa que dos instancias del mismo registro con valores idénticos son equivalentes.
Además de poder usar la notación de punto para acceder a los campos de un registro, los registros también se pueden deconstruir en enlaces y en coincidencia de patrones:
let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress
match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway
En este ejercicio eres un gran fanático del deporte y acabas de descubrir tu pasión por el básquetbol de la NBA. Como eres nuevo en el básquetbol de la NBA, estás haciendo una inmersión profunda en la historia de la NBA: llevas un registro de equipos, entrenadores y sus estadísticas de victorias y derrotas, y los comparas entre sí.
Como todavía no tienes un equipo favorito, también vas a desarrollar un algoritmo para determinar si deberías apoyar a un equipo en particular.
Tienes siete tareas que te ayudarán a desarrollar tu algoritmo patentado para apoyar a un equipo.
Define el registro Coach con los siguientes dos campos:
Name: el nombre del entrenador, de tipo string.FormerPlayer: indica si el entrenador fue un exjugador, de tipo bool.Define el registro Stats con los siguientes dos campos:
Wins: la cantidad de victorias, de tipo int.Losses: la cantidad de derrotas, de tipo int.Define el registro Team con los siguientes tres campos:
Name: el nombre del equipo, de tipo string.Coach: el entrenador del equipo, de tipo Coach.Stats: las estadísticas del equipo, de tipo Stats.Implementa la función createCoach que toma como parámetros el nombre del entrenador y su condición de exjugador, y devuelve su registro Coach:
createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }
Implementa la función createStats que toma como parámetros el número de victorias y el número de derrotas, y devuelve su registro Stats:
createStats 58 24
// => { Wins = 58; Losses = 24 }
Implementa la función createTeam que toma como parámetros el nombre del equipo, el entrenador y el registro, y devuelve su registro Team:
let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
// Coach = { Name = "Larry Bird"; FormerPlayer = true }
// Stats = { Wins = 58; Losses = 24 } }
Como los dueños de los equipos de la NBA son impacientes, descubriste que los malos resultados del equipo a menudo llevaban a que reemplazaran al entrenador. Implementa la función replaceCoach que toma como parámetros el equipo y su nuevo entrenador, y devuelve el equipo pero con el nuevo entrenador:
let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record
let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
// Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
// Stats = { Wins = 58; Losses = 24 } }
Mientras profundizas en las estadísticas, mantienes listas de equipos y sus registros. A veces te equivocas y hay entradas duplicadas en tu lista. Implementa la función isSameTeam que toma dos equipos y devuelve true si son el mismo equipo; de lo contrario, devuelve false:
let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats
let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats
isSameTeam pacersTeam lakersTeam
// => false
Después de analizar muchos equipos y partidos, ideaste un algoritmo. Si se cumple alguna de las siguientes condiciones, apoyas a ese equipo:
Implementa la función rootForTeam que toma un equipo y devuelve true si deberías apoyar a ese equipo; de lo contrario, return false:
let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.