En este módulo, exploraremos dos estructuras de datos fundamentales en F#: las tuplas y los registros. Estas estructuras son esenciales para organizar y manipular datos de manera eficiente y clara en F#.

Tuplas

¿Qué es una Tupla?

Una tupla es una estructura de datos que puede contener un número fijo de elementos de diferentes tipos. Las tuplas son útiles para agrupar datos relacionados sin necesidad de definir un tipo de datos complejo.

Sintaxis de las Tuplas

La sintaxis básica para definir una tupla en F# es la siguiente:

let myTuple = (1, "hello", true)

En este ejemplo, myTuple es una tupla que contiene un entero, una cadena y un booleano.

Acceso a los Elementos de una Tupla

Puedes acceder a los elementos de una tupla utilizando el patrón de coincidencia:

let (a, b, c) = myTuple
printfn "a: %d, b: %s, c: %b" a b c

Ejemplo Práctico

Vamos a ver un ejemplo práctico donde utilizamos una tupla para devolver múltiples valores desde una función:

let calculateStats numbers =
    let sum = List.sum numbers
    let count = List.length numbers
    let average = float sum / float count
    (sum, count, average)

let numbers = [1; 2; 3; 4; 5]
let (sum, count, average) = calculateStats numbers
printfn "Sum: %d, Count: %d, Average: %f" sum count average

Ejercicio

Ejercicio 1: Define una función que tome una lista de enteros y devuelva una tupla con el valor mínimo y máximo de la lista.

let minMax numbers =
    let minValue = List.min numbers
    let maxValue = List.max numbers
    (minValue, maxValue)

let numbers = [3; 1; 4; 1; 5; 9]
let (minValue, maxValue) = minMax numbers
printfn "Min: %d, Max: %d" minValue maxValue

Registros

¿Qué es un Registro?

Un registro es una estructura de datos que agrupa varios valores bajo un solo nombre, con cada valor identificado por un nombre de campo. Los registros son útiles para representar datos estructurados de manera clara y legible.

Definición de un Registro

La sintaxis básica para definir un registro en F# es la siguiente:

type Person = {
    Name: string
    Age: int
    Email: string
}

Creación de Instancias de Registros

Puedes crear una instancia de un registro utilizando la siguiente sintaxis:

let person = { Name = "John Doe"; Age = 30; Email = "[email protected]" }

Acceso a los Campos de un Registro

Puedes acceder a los campos de un registro utilizando la notación de punto:

printfn "Name: %s, Age: %d, Email: %s" person.Name person.Age person.Email

Ejemplo Práctico

Vamos a ver un ejemplo práctico donde utilizamos un registro para representar una persona y una función para actualizar su edad:

type Person = {
    Name: string
    Age: int
    Email: string
}

let updateAge person newAge =
    { person with Age = newAge }

let person = { Name = "John Doe"; Age = 30; Email = "[email protected]" }
let updatedPerson = updateAge person 31
printfn "Updated Age: %d" updatedPerson.Age

Ejercicio

Ejercicio 2: Define un registro Book con los campos Title, Author y YearPublished. Luego, crea una instancia de Book y una función que actualice el año de publicación.

type Book = {
    Title: string
    Author: string
    YearPublished: int
}

let updateYearPublished book newYear =
    { book with YearPublished = newYear }

let book = { Title = "F# for Fun and Profit"; Author = "Scott Wlaschin"; YearPublished = 2014 }
let updatedBook = updateYearPublished book 2021
printfn "Updated Year Published: %d" updatedBook.YearPublished

Conclusión

En esta sección, hemos aprendido sobre las tuplas y los registros en F#. Las tuplas son útiles para agrupar datos heterogéneos de manera rápida y sencilla, mientras que los registros proporcionan una forma más estructurada y legible de organizar datos relacionados. Ambos son herramientas poderosas en F# que te ayudarán a escribir código más claro y eficiente.

En el próximo módulo, exploraremos las uniones discriminadas, otra estructura de datos fundamental en F#.

Curso de Programación en F#

Módulo 1: Introducción a F#

Módulo 2: Conceptos Básicos

Módulo 3: Programación Funcional

Módulo 4: Estructuras de Datos Avanzadas

Módulo 5: Programación Orientada a Objetos en F#

Módulo 6: Programación Asíncrona y Paralela

Módulo 7: Acceso y Manipulación de Datos

Módulo 8: Pruebas y Depuración

Módulo 9: Temas Avanzados

Módulo 10: Aplicaciones Prácticas

© Copyright 2024. Todos los derechos reservados