Вираз 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"
У наведеному вище прикладі не кожні можливі вхідні дані матимуть відповідний зразок. Компілятор це виявить і видасть попередження. Це називають перевіркою на вичерпність. Щоб позбутися цього попередження, потрібно опрацювати всі випадки. Для цього можна використати зразок-підстановку, який зіставляється з будь-яким значенням:
match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"
// No compiler warning
Зіставлення зі зразком перевіряє значення на відповідність кожному зразку згори донизу, доки не знайде відповідний зразок і не виконає логіку, повʼязану з цим зразком. Порядок зразків має значення!
У цій вправі ми граємо з другом у гру, де треба вгадати число. Правила прості: ми таємно обираємо число від 1 до 100, а наш друг намагається вгадати, яке число ми обрали. Щоб допомогти другові, ми відповідаємо по-різному залежно від того, наскільки близькою була здогадка до обраного числа (42). Ось правила для різних відповідей:
42: «Correct»41 або 43: «So close»41: «Too low»43: «Too high»На нас чекають чотири завдання: потрібно закодувати відповіді на здогадки.
Реалізуйте функцію reply, щоб вона відповідала на правильну здогадку:
reply 42
// => "Correct"
Змініть функцію reply, щоб вона відповідала на близькі здогадки:
reply 41
// => "So close"
Змініть функцію reply, щоб вона відповідала на надто малі здогадки:
reply 25
// => "Too low"
Змініть функцію reply, щоб вона відповідала на надто великі здогадки:
reply 88
// => "Too high"
Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.