Вираз 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"