En F#, las colecciones son estructuras de datos fundamentales que permiten almacenar y manipular conjuntos de elementos. En este tema, exploraremos tres tipos principales de colecciones: Listas, Arreglos y Secuencias. Cada una de estas colecciones tiene sus propias características y usos específicos.
Listas
Las listas en F# son colecciones inmutables y enlazadas de elementos del mismo tipo. Son muy utilizadas en programación funcional debido a su inmutabilidad y facilidad de uso.
Creación de Listas
Operaciones Básicas con Listas
- Acceso a Elementos: Puedes acceder a los elementos de una lista usando el operador de índice.
- Agregar Elementos: Puedes agregar elementos al inicio de una lista usando el operador
::
.
- Concatenar Listas: Puedes concatenar dos listas usando el operador
@
.
Ejemplo Práctico
let rec sumaLista lista = match lista with | [] -> 0 | cabeza :: cola -> cabeza + sumaLista cola let resultado = sumaLista listaConElementos // 15
Arreglos
Los arreglos en F# son colecciones mutables de elementos del mismo tipo. Son útiles cuando necesitas modificar los elementos de la colección.
Creación de Arreglos
Operaciones Básicas con Arreglos
- Acceso a Elementos: Puedes acceder a los elementos de un arreglo usando el operador de índice.
- Modificar Elementos: Puedes modificar los elementos de un arreglo usando el operador de índice.
- Iterar sobre Arreglos: Puedes usar bucles
for
para iterar sobre los elementos de un arreglo.
Ejemplo Práctico
let duplicarArreglo (arreglo: int[]) = for i in 0 .. arreglo.Length - 1 do arreglo.[i] <- arreglo.[i] * 2 duplicarArreglo arregloConElementos
Secuencias
Las secuencias en F# son colecciones inmutables y perezosas de elementos del mismo tipo. Son útiles cuando trabajas con grandes conjuntos de datos o flujos de datos.
Creación de Secuencias
Operaciones Básicas con Secuencias
- Acceso a Elementos: Puedes acceder a los elementos de una secuencia usando funciones como
Seq.nth
.
- Transformar Secuencias: Puedes usar funciones como
Seq.map
para transformar los elementos de una secuencia.
- Filtrar Secuencias: Puedes usar funciones como
Seq.filter
para filtrar los elementos de una secuencia.
Ejemplo Práctico
let sumaSecuencia secuencia = secuencia |> Seq.sum let resultado = sumaSecuencia secuenciaConElementos // 15
Ejercicios Prácticos
Ejercicio 1: Suma de Elementos de una Lista
Escribe una función que sume todos los elementos de una lista de enteros.
let rec sumaLista lista = match lista with | [] -> 0 | cabeza :: cola -> cabeza + sumaLista cola // Prueba tu función let lista = [1; 2; 3; 4; 5] let resultado = sumaLista lista // 15
Ejercicio 2: Duplicar Elementos de un Arreglo
Escribe una función que duplique cada elemento de un arreglo de enteros.
let duplicarArreglo (arreglo: int[]) = for i in 0 .. arreglo.Length - 1 do arreglo.[i] <- arreglo.[i] * 2 // Prueba tu función let arreglo = [| 1; 2; 3; 4; 5 |] duplicarArreglo arreglo // arreglo ahora es [| 2; 4; 6; 8; 10 |]
Ejercicio 3: Filtrar Números Pares en una Secuencia
Escribe una función que filtre los números pares de una secuencia de enteros.
let filtrarPares secuencia = secuencia |> Seq.filter (fun x -> x % 2 = 0) // Prueba tu función let secuencia = seq { 1 .. 10 } let resultado = filtrarPares secuencia // resultado es seq [2; 4; 6; 8; 10]
Conclusión
En esta sección, hemos explorado las colecciones en F#, incluyendo listas, arreglos y secuencias. Cada tipo de colección tiene sus propias características y usos específicos. Las listas son inmutables y fáciles de usar en programación funcional, los arreglos son mutables y eficientes para modificaciones, y las secuencias son perezosas y útiles para trabajar con grandes conjuntos de datos. Con estos conocimientos, estás preparado para manejar colecciones de datos en F# de manera efectiva.
Curso de Programación en F#
Módulo 1: Introducción a F#
Módulo 2: Conceptos Básicos
- Tipos de Datos y Variables
- Funciones e Inmutabilidad
- Coincidencia de Patrones
- Colecciones: Listas, Arreglos y Secuencias
Módulo 3: Programación Funcional
- Funciones de Orden Superior
- Recursión
- Encadenamiento y Composición
- Aplicación Parcial y Currificación
Módulo 4: Estructuras de Datos Avanzadas
Módulo 5: Programación Orientada a Objetos en F#
- Clases y Objetos
- Herencia e Interfaces
- Mezclando Programación Funcional y Orientada a Objetos
- Módulos y Espacios de Nombres
Módulo 6: Programación Asíncrona y Paralela
- Flujos de Trabajo Asíncronos
- Biblioteca de Tareas Paralelas
- MailboxProcessor y Agentes
- Patrones de Concurrencia
Módulo 7: Acceso y Manipulación de Datos
Módulo 8: Pruebas y Depuración
- Pruebas Unitarias con NUnit
- Pruebas Basadas en Propiedades con FsCheck
- Técnicas de Depuración
- Perfilado de Rendimiento