En F#, un array est une collection mutable de zéro ou plusieurs valeurs dont la longueur est fixe. Cela signifie qu'une fois qu'un tableau a été créé, sa taille ne peut plus changer, mais que ses valeurs, elles, peuvent l'être. Toutes les valeurs d'un tableau doivent avoir le même type. On peut définir un tableau comme suit :
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
On peut affecter des éléments à un tableau ou en récupérer à 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 se manipulent à l'aide des fonctions et des opérateurs définis dans le module Array. Certaines de ces fonctions sont aussi disponibles sous forme de propriétés d'une instance d'array :
Array.length [| 7; 8 |] // => 2
[| 7; 8 |].Length // => 2
Il n'y a pas de bon ou de mauvais choix ici. En général, les fonctions du module Array s'accordent mieux avec l'inférence de type, tandis que les propriétés permettent d'écrire du code plus concis.
Le motif de tableau permet le filtrage par motif sur les tableaux :
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 du filtrage par motif ; lorsque l'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 underscore ('_') pour le signifier :
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 du filtrage par motif : toute valeur qui ne correspond à aucun des autres cas sera traitée par ce cas.