Un array in F# è una raccolta modificabile di zero o più valori con una lunghezza fissa. Questo significa che una volta creato un array, la sua dimensione non può cambiare, ma i suoi valori sì. I valori in un array devono avere tutti lo stesso tipo. Gli array possono essere definiti come segue:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Gli elementi possono essere assegnati a un array o recuperati da esso usando un indice. Gli array in F# sono basati su zero, il che significa che l'indice del primo elemento è sempre zero:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
Gli array vengono manipolati da funzioni e operatori definiti nel modulo Array. Alcune di queste funzioni sono disponibili anche come proprietà di un'istanza di array:
Array.length [| 7; 8 |] // => 2
[| 7; 8 |].Length // => 2
Non c'è un'opzione giusta o sbagliata qui. In generale, le funzioni nel modulo Array si integrano meglio con l'inferenza di tipo, mentre le proprietà consentono un codice più conciso.
Il pattern di array consente il pattern matching sugli 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"
Puoi anche scartare un valore durante il pattern matching; quando non ti interessa un valore in un caso specifico (cioè non hai intenzione di usare un valore) puoi usare un underscore ('_') per indicarlo:
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)"
Il singolo '_' dovrebbe sempre venire per ultimo nel pattern matching; ogni valore che non corrisponde a nessuno degli altri casi sarà gestito da questo caso.