Треки
/
F#
F#
/
Салабус
/
Зіставлення зі зразком
Зі

Зіставлення зі зразком у F#

1 вправа

Про концепцію Зіставлення зі зразком

Вираз if/elif/else можна використовувати, щоб умовно виконувати логіку. У F# є й інший, потужніший спосіб умовно виконувати логіку: зіставлення зі зразком. За допомогою зіставлення зі зразком значення можна перевірити на відповідність одному чи кільком зразкам. Приклад такого зразка - зразок константи, який порівнює значення з константою (наприклад, 1 або "hello").

У F# зіставлення зі зразком виконується за допомогою ключового слова match:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

Хоча це може мати вигляд інструкцій switch в інших мовах, зіставлення зі зразком по-справжньому розкривається, коли ми використовуємо й інші зразки. Один із таких зразків - зразок змінної, який дає змогу захопити значення:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

У деяких випадках може знадобитися додати до зразка додаткову умову. Це називається захисною умовою, яку можна додати за допомогою ключового слова when:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

Захисна умова може бути будь-яким коректним виразом, зокрема викликом функцій.

У наведеному вище прикладі не всі можливі вхідні дані матимуть відповідний зразок. Компілятор це виявить і видасть попередження. Це називається вичерпним зіставленням. Щоб позбутися попередження, потрібно опрацювати всі випадки. Для цього можна використати [зразок-замінник][wildcard-pattern], який відповідає будь-якому значенню:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Зауважимо, що компілятор не може використовувати умови when, щоб визначити вичерпність:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

Зіставлення зі зразком перевіряє значення на відповідність кожному зразку згори донизу, доки не знайде відповідний зразок і не виконає логіку, повʼязану з цим зразком. Порядок зразків має значення! Тому зразок-замінник має завжди бути останнім зразком у виразі match.

Хоча зіставлення зі зразком є дуже потужним, просту умовну логіку зазвичай можна ясніше записати за допомогою виразу if/else:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Зіставлення зі зразком