Um array (ou vetor) em F# é uma coleção mutável de zero ou mais valores com um comprimento fixo. Isto significa que, depois de criado um array, o seu tamanho não pode mudar, mas os seus valores podem. Os valores de um array têm de ser todos do mesmo tipo. Os arrays podem ser definidos da seguinte forma:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Podes atribuir elementos a um array ou obtê-los a partir dele através de um índice. Os arrays de F# começam em zero, o que significa que o índice do primeiro elemento é sempre zero:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
Os arrays são manipulados através de funções e operadores definidos no módulo Array ou, manualmente, com correspondência de padrões através do padrão 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"
Também podes descartar um valor durante a correspondência de padrões. Quando não te importas com um valor num caso específico (ou seja, não vais usar esse valor), podes usar um underscore ('_') para o indicar:
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)"
O '_' isolado deve ficar sempre em último lugar na correspondência de padrões: todos os valores que não correspondam a nenhum dos outros casos serão tratados por este caso.
És um observador de aves entusiasta que acompanha quantas aves visitaram o teu jardim nos últimos sete dias.
Tens seis tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.
Para poderes comparar, tens sempre por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Define a ligação lastWeek que contém as contagens da semana passada:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Implementa a função yesterday para devolver quantas aves visitaram o teu jardim ontem. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
Implementa a função total para devolver o número total de aves que visitaram o teu jardim:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Implementa a função dayWithoutBirds, que devolve true se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve false:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Implementa a função incrementTodaysCount para incrementar a contagem de hoje e devolver as contagens atualizadas:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
Ao longo do último ano, descobriste que algumas semanas têm os mesmos padrões invulgares:
Implementa a função unusualWeek, que devolve true se o padrão de contagem de aves desta semana corresponder a um dos padrões invulgares:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Repara que a paridade dos dias é indexada a partir de 1, não de 0: o primeiro elemento do array corresponde a um dia ímpar)
Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.