list у F# - це незмінна колекція, що містить нуль або більше значень. Усі значення в масиві мають бути одного типу. Оскільки масиви незмінні, після створення масиву його значення вже ніколи не зміниться. Будь-які функції чи оператори, які нібито змінюють масив (наприклад, додають елемент), насправді повертають новий масив.
Масиви можна визначити так:
let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]
Найчастіше елемент додають до масиву за допомогою оператора :: (cons):
let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]
Масив у F# має голову (перший елемент) і хвіст (усе, що йде після першого елемента). Хвіст масиву - це теж масив.
Масиви можна обробляти або за допомогою функцій і операторів, визначених у модулі List, або вручну, за допомогою зіставлення зі зразком, використовуючи зразки list і cons:
let describe list =
match list with
| [] -> "Empty list"
| head::tail -> sprintf "Non-empty list with head: %d" head
describe [] // => "Empty list"
describe [1] // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"
Ми також можемо відкинути значення під час зіставлення зі зразком; коли значення в конкретному випадку нам не важливе (тобто ми не збираємося його використовувати), можна позначити це символом підкреслення ('_'):
let describe list =
match list with
| [] -> "Empty list"
| [x] -> "List with one item"
| [_; y] -> "List with two items (first item ignored)"
| _ -> "List with many items (all items ignored)"
describe [] // => "Empty list"
describe [1] // => "List with one item"
describe [5; 7] // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"
Одиничний '_' завжди має стояти останнім у зіставленні зі зразком: кожне значення, яке не відповідає жодному з інших випадків, оброблятиметься цим випадком.
У цій вправі ми будемо писати код, щоб відстежувати масив мов програмування, які хочемо вивчати на Exercism.
На нас чекає шість завдань, і всі вони будуть повʼязані з масивами.
Щоб відстежувати мови, які ми хочемо вивчати, нам потрібно створити новий масив. Визначте привʼязку newList, що містить новий порожній масив.
newList
// => []
Зараз у нас є аркуш паперу з переліком мов, які ми хочемо вивчати: F#, Clojure і Haskell. Визначте привʼязку existingList, щоб представити цей масив.
existingList
// => ["F#"; "Clojure"; "Haskell"]
Досліджуючи Exercism і знаходячи цікавіші мови, ми хочемо додавати їх до свого масиву. Реалізуйте функцію addLanguage, щоб додати нову мову на початок масиву.
addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]
Порахувати мови по одній незручно. Реалізуйте функцію countLanguages, щоб порахувати кількість мов у масиві.
countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4
У якийсь момент ми розуміємо, що наш масив насправді впорядковано у зворотному порядку! Реалізуйте функцію reverseList, щоб перевернути масив.
reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]
Хоча ми любимо всі мови, F# посідає особливе місце в нашому серці. Тож масив мов викликає в нас справжнє захоплення, якщо:
Реалізуйте функцію excitingList, щоб перевірити, чи масив мов захопливий:
excitingList ["Nim"; "F#"]
// => true
Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.