Colecciones y listas

Completado

Puede encontrarse en una situación en la que tenga más de un tipo de datos. Podría crear una variable para cada dato o agruparlos todos en una colección. La agrupación de los datos ofrece ventajas como la capacidad de aplicar métodos no solo en fragmentos de datos individuales, sino también en la colección en su conjunto.

Colecciones

El primer signo de que necesita usar una colección es que tiene varios fragmentos de datos que parecen ser del mismo tipo. Es posible que se encuentre en un escenario en el que tenga muchas entradas, como en el código siguiente:

let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"

En este código, puede seguir agregando una entrada similar después de otra, pero, en un determinado momento, ese enfoque comienza a ser poco práctico. Las entradas independientes no solo están relacionadas, sino que, de hecho, son del mismo tipo. ¿Es buena idea crear una variable para cada entrada? Probablemente no. Valore la posibilidad de usar una colección, que le permite crear una agrupación lógica y administrable, ya sea agregando o quitando datos o bien usando alguna otra operación:

logEntriesWeek = ["first entry"; "second entry"; "third entry"]

Este código no solo requiere mucha menos escritura, sino que también da una sensación de orden, donde todo lo relacionado se agrupa.

¿Qué le puede ofrecer F#? Para empezar, ofrece tres tipos de colecciones, cada una diseñada para una situación determinada.

  • Listas: una lista en F# es un conjunto ordenado e inmutable de elementos del mismo tipo. "Inmutable" significa que una lista puede ofrecer un mejor rendimiento que una matriz, pero es posible que le cueste un mayor esfuerzo cambiar su contenido. Por ejemplo, es posible que desee crear una lista a partir de una existente. Esta unidad se centra en el uso de listas.

  • Matrices: las matrices son colecciones mutables de tamaño fijo de elementos de datos del mismo tipo ordenados de manera consecutiva con un índice de base cero. "Mutable" significa que es fácil agregar y quitar elementos de datos, pero puede haber un impacto en el rendimiento.

  • Secuencias: una secuencia es una serie lógica de elementos del mismo tipo. Una secuencia da la sensación de ser Just-In-Time porque funciona bien con grandes colecciones de datos, donde no espera usar todos los elementos. También procesa los elementos solo cuando es necesario hacerlo. Por lo tanto, las secuencias pueden ofrecer un mejor rendimiento que las listas en determinadas situaciones.

Listas

Como se ha mencionado, una lista es un conjunto ordenado e inmutable de elementos. Estas son formas de crear una lista:

let cards = ["Ace"; "King"; "Queen"]

En este código, se incluyen los elementos entre corchetes ([]) para definir la lista. Los elementos de lista están separados por un punto y coma (;).

Otra forma de crear una lista es situar cada elemento en una línea nueva, como se muestra aquí. Este método también elimina la necesidad de usar punto y coma.

let cards = [
  "Ace"
  "King"
  "Queen"
]

En las listas, los elementos tienen que ser del mismo tipo, por lo que no se permite la declaración siguiente:

let cards = [ 1; "Ace"; "King" ] // not permitted

En este código, dado que la declaración combina números y cadenas, no se permite. Otra forma de crear una lista es usar un operador de intervalo (..). La idea es especificar los elementos inicial y final, separados por un operador de intervalo (..). Al hacerlo, se crean todos los números de principio a fin, incluidos los elementos entre ellos. Por ejemplo, puede crear los números 1 2 3 4 5 mediante el código siguiente:

let numbers = [ 1 .. 5 ]

Modificación de una lista

Como hemos mencionado, las listas son inmutables, lo que significa que no pueden modificar. Sin embargo, si lo piensa de forma diferente, puede hacer que parezca que va a agregar un elemento o incluso una lista con elementos a una lista. ¿Qué implica esto? Considere el ejemplo siguiente:

let cards = ["Ace"; "King"; "Queen"]

El código anterior es una lista que consta de tres cadenas. Mediante el uso de un operador de dos puntos dobles (::), puede anexar un elemento al inicio de una lista. El resultado es una lista nueva, mientras que la antigua no se ve afectada:

let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen" 

También puede agregar una lista completa mediante el operador de arroba (@), como se muestra aquí:

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"

Hay una función append() en el módulo de lista y sirve para las colecciones de matrices y las de secuencias. Es preferible usar append() si, por ejemplo, necesita cambiar el tipo de colección de lista a secuencia o si desea ahorrarse tener que aprender una forma nueva de agregar elementos. El uso de la arroba (@) a fin de agregar elementos a una lista solo funciona para una estructura de lista. Regresemos a nuestros dos ejemplos y vamos a usar append() en su lugar:

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["10"; "9"]
let fullList = cards |> List.append ["Jack"] // "Jack", "Ace", "King", "Queen"
let fullList = cards |> List.append otherCardList // "10", "9", "Ace", "King", "Queen"

Propiedades

Las listas de F# se implementan como listas de vínculos. Es decir, una lista es una estructura en la que cada elemento está conectado a otro. Los términos adicionales que quedan por aprender son encabezado, que es el primer elemento de la lista, y cola, que incluye los elementos que no están en el encabezado. Por ejemplo, en la lista 1 2 3 4, el encabezado sería 1 y la cola, 2 3 4.

Al separar los elementos de esta forma, puede acceder rápidamente al primero para leerlo, quitarlo o realizar otras acciones en él. Para acceder a cualquier elemento específico de la lista, puede usar una propiedad Item, que toma un índice de base cero, como se muestra aquí:

let list = [1; 2; 3; 4]
list.Item 1 // 2

Las propiedades de la lista se describen en la tabla siguiente:

Propiedad Descripción
Head El primer elemento de una lista
Vacío Devuelve una lista vacía, que se puede usar cuando se quiere crear una lista vacía
IsEmpty Comprueba si la lista actual está vacía
Elemento Recupera el elemento actual en la posición especificada (índice de base cero)
Longitud Devuelve el número de elementos de la lista
Tail Devuelve todos los elementos de la lista, menos el primero