array у F# це колекція з нуля або більше значень фіксованої довжини, яку можна змінювати. Це означає, що після створення масиву його розмір уже не зміниться, але значення в ньому змінювати можна. Усі значення в масиві повинні мати однаковий тип. Масиви можна визначити так:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Елементи можна присвоювати масиву або отримувати з нього за індексом. Масиви F# мають нульову індексацію: індекс першого елемента завжди дорівнює нулю:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
З масивами працюють або через функції та оператори, визначені в модулі 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"
Під час зіставлення зі зразком значення можна також відкинути: якщо в конкретному випадку значення нас не цікавить (тобто ми не збираємося його використовувати), для цього можна використати знак підкреслення ('_'):
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)"
Одиничний '_' завжди має стояти останнім у зіставленні зі зразком: будь-яке значення, яке не збігається з жодним іншим випадком, обробить саме він.
Ми завзяті спостерігачі за птахами й ведемо облік того, скільки птахів завітало до нашого саду за останні сім днів.
На нас чекає шість завдань, і всі вони стосуються кількості птахів, які відвідали наш сад.
Для порівняння ми завжди тримаємо поруч копію підрахунків за минулий тиждень, а саме: 0, 2, 5, 3, 7, 8 і 4. Визначте привʼязку lastWeek, яка містить підрахунки за минулий тиждень:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Реалізуйте функцію yesterday, яка повертає кількість птахів, що відвідали наш сад учора. Підрахунки птахів упорядковано за днями: перший елемент масиву - це підрахунок за найдавніший день, а останній - за сьогодні.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
Реалізуйте функцію total, яка повертає загальну кількість птахів, що відвідали наш сад:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Реалізуйте функцію dayWithoutBirds, яка повертає true, якщо був день, коли до саду не прилетів жоден птах; інакше повертає false:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Реалізуйте функцію incrementTodaysCount, яка збільшує сьогоднішній підрахунок і повертає оновлені підрахунки:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
За останній рік ми виявили, що деякі тижні мають однакові незвичайні закономірності:
Реалізуйте функцію unusualWeek, яка повертає true, якщо закономірність підрахунків птахів цього тижня збігається з однією з незвичайних закономірностей:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Зауважте, що парність днів нумерується з 1, а не з 0: перший елемент масиву відповідає непарному дню)
Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.