Треки
/
F#
F#
/
Вправи
/
Гра у вгадування
Гра у вгадування

Гра у вгадування

Навчальна вправа

Вступ

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

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

На нас чекають чотири завдання: потрібно закодувати відповіді на здогадки.

1. Дайте відповідь на правильну здогадку

Реалізуйте функцію reply, щоб вона відповідала на правильну здогадку:

reply 42
// => "Correct"

2. Дайте відповідь на близьку здогадку

Змініть функцію reply, щоб вона відповідала на близькі здогадки:

reply 41
// => "So close"

3. Дайте відповідь на надто малі здогадки

Змініть функцію reply, щоб вона відповідала на надто малі здогадки:

reply 25
// => "Too low"

4. Дайте відповідь на надто великі здогадки

Змініть функцію reply, щоб вона відповідала на надто великі здогадки:

reply 88
// => "Too high"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
F# Exercism

Час розпочати Гра у вгадування?

Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.