Un array en F# est une collection modifiable de zéro ou plusieurs valeurs et de longueur fixe. Cela signifie qu'une fois qu'un tableau a été créé, sa taille ne peut plus changer, mais que ses valeurs, elles, peuvent être modifiées. Toutes les valeurs d'un tableau doivent avoir le même type. Les tableaux peuvent être définis comme suit :
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
On peut affecter une valeur à un élément d'un tableau ou récupérer cet élément à l'aide d'un indice. Les tableaux F# sont indexés à partir de zéro, ce qui signifie que l'indice du premier élément est toujours zéro :
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
Les tableaux sont soit manipulés par des fonctions et des opérateurs définis dans le module Array, soit manuellement par correspondance de motifs, avec le motif tableau :
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"
On peut aussi ignorer une valeur lors d'une correspondance de motifs ; quand on ne se soucie pas d'une valeur dans un cas précis (c'est-à-dire qu'on ne va pas utiliser cette valeur), on peut utiliser un tiret bas ('_') pour l'indiquer :
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)"
Le '_' seul doit toujours venir en dernier lors d'une correspondance de motifs ; toute valeur qui ne correspond à aucun des autres cas sera traitée par ce cas.
Tu es un passionné d'observation des oiseaux qui note combien d'oiseaux ont visité ton jardin ces sept derniers jours.
Tu as six tâches, toutes portant sur le nombre d'oiseaux qui ont visité ton jardin.
Pour pouvoir comparer, tu gardes toujours une copie des comptages de la semaine dernière à portée de main, qui étaient : 0, 2, 5, 3, 7, 8 et 4. Définis la liaison lastWeek qui contient les comptages de la semaine dernière :
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Implémente la fonction yesterday pour qu'elle renvoie le nombre d'oiseaux qui ont visité ton jardin hier. Les comptages d'oiseaux sont ordonnés par jour, le premier élément étant le comptage du jour le plus ancien et le dernier celui d'aujourd'hui.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
Implémente la fonction total pour qu'elle renvoie le nombre total d'oiseaux qui ont visité ton jardin :
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Implémente la fonction dayWithoutBirds qui renvoie true s'il y a eu un jour où aucun oiseau n'a visité le jardin ; sinon, elle renvoie false :
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Implémente la fonction incrementTodaysCount pour incrémenter le comptage d'aujourd'hui et renvoyer les comptages mis à jour :
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
Au cours de l'année écoulée, tu as remarqué que certaines semaines présentent les mêmes motifs inhabituels :
Implémente la fonction unusualWeek qui renvoie true si le motif de comptage d'oiseaux de cette semaine correspond à l'un des motifs inhabituels :
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Note que la parité des jours est indexée à partir de 1, et non de 0 : le premier élément du tableau correspond à un jour impair)
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.