Um array (ou vetor) em F# é uma coleção mutável de zero ou mais valores com comprimento fixo. Isso significa que, depois que um array é criado, seu tamanho não pode mudar, mas seus valores podem. Todos os valores de um array precisam ter o mesmo tipo. Os arrays podem ser definidos assim:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Os elementos podem ser atribuídos a um array ou recuperados dele usando um índice. Os arrays em F# são indexados a partir do 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 por funções e operadores definidos no módulo Array, ou manualmente com correspondência de padrões usando o 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"
Você também pode descartar um valor na correspondência de padrões; quando você não se importa com um valor em um caso específico (ou seja, você não vai usar um valor), você pode usar um sublinhado ('_') para indicar isso:
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 '_' sozinho deve sempre vir por último na correspondência de padrões; todo valor que não corresponder a nenhum dos outros casos será tratado por esse caso.
Você adora observar pássaros e acompanha quantos pássaros visitaram seu jardim nos últimos sete dias.
Você tem seis tarefas, todas sobre os números de pássaros que visitaram seu jardim.
Para fins de comparação, você sempre mantém por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Defina o binding lastWeek que contém as contagens da semana passada:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Implemente a função yesterday para retornar quantos pássaros visitaram seu jardim ontem. As contagens de pássaros 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
Implemente a função total para retornar o número total de pássaros que visitaram seu jardim:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Implemente a função dayWithoutBirds que retorna true se houve um dia em que zero pássaros visitaram o jardim; caso contrário, retorne false:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Implemente a função incrementTodaysCount para incrementar a contagem de hoje e retornar as contagens atualizadas:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
Ao longo do último ano, você percebeu que algumas semanas têm os mesmos padrões incomuns:
Implemente a função unusualWeek que retorna true se o padrão de contagem de pássaros desta semana corresponder a um dos padrões incomuns:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Repare que a paridade dos dias é indexada a partir de 1, não de 0: o primeiro elemento do array corresponde a um dia ímpar)
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.