Un array en F# es una colección mutable de cero o más valores con una longitud fija. Esto significa que una vez que se ha creado un array, su tamaño no puede cambiar, pero sus valores sí. Los valores de un array deben ser todos del mismo tipo. Los arrays se pueden definir de la siguiente manera:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Se pueden asignar elementos a un array u obtenerlos de él usando un índice. Los arrays de F# están basados en cero, lo que significa que el índice del primer elemento siempre es cero:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
Los arrays se manipulan ya sea con funciones y operadores definidos en el módulo Array, o manualmente usando coincidencia de patrones con el patrón array:
let describe array =
match array with
| [| |] -> "Empty"
| [| 1; 2; three |] -> sprintf "1, 2, %d" three
| _ -> "Other"
describe [| |] // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"
También puedes descartar un valor al hacer coincidencia de patrones; cuando no te importa un valor en un caso específico (es decir, no vas a usar un valor) puedes usar un guion bajo ('_') para indicar esto:
let describe array =
match array with
| [| |] -> "Empty array"
| [| x |] -> "Array with one item"
| [| _; y |] -> "Array with two items (first item ignored)"
| _ -> "Array with many items (all items ignored)"
describe [| |] // => "Empty array"
describe [| 1 |] // => "Array with one item"
describe [| 5; 7 |] // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |] // => "Array with many items (all items ignored)"
El '_' solo debe ir siempre al final al hacer coincidencia de patrones; todo valor que no coincida con ninguno de los otros casos será manejado por este caso.
Eres un ávido observador de aves que lleva la cuenta de cuántas aves han visitado tu jardín en los últimos siete días.
Tienes seis tareas, todas relacionadas con la cantidad de aves que visitaron tu jardín.
Para poder comparar, siempre tienes cerca una copia de los conteos de la semana pasada, que fueron: 0, 2, 5, 3, 7, 8 y 4. Define el enlace lastWeek que contiene los conteos de la semana pasada:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Implementa la función yesterday para que devuelva cuántas aves visitaron tu jardín ayer. Los conteos de aves están ordenados por día: el primer elemento es el conteo del día más antiguo y el último elemento es el conteo de hoy.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
Implementa la función total para que devuelva la cantidad total de aves que han visitado tu jardín:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Implementa la función dayWithoutBirds que devuelve true si hubo un día en el que ninguna ave visitó el jardín; de lo contrario, devuelve false:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Implementa la función incrementTodaysCount para incrementar el conteo de hoy y devolver los conteos actualizados:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
Durante el último año, has notado que algunas semanas comparten los mismos patrones inusuales:
Implementa la función unusualWeek que devuelve true si el patrón de conteo de aves de esta semana coincide con uno de los patrones inusuales:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Fíjate que la paridad de los días se cuenta desde 1, no desde 0: el primer elemento del array corresponde a un día impar)
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.