F#
Соответствие шаблону
Поиск…
замечания
Совместимость шаблонов - это мощная функция многих функциональных языков, поскольку она часто позволяет обрабатывать ветвление очень кратко по сравнению с использованием нескольких операторов if
/ else if
/ else
. Однако, учитывая достаточно вариантов и «когда» охранники , сопоставление образцов также может стать многословным и трудно понять с первого взгляда.
Когда это происходит, активные шаблоны F # могут стать отличным способом дать значимые имена логике соответствия, что упрощает код, а также позволяет повторно использовать.
Варианты соответствия
Согласование шаблонов может быть полезно для обработки параметров:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
Проверка соответствия шаблонов всему домену
let x = true
match x with
| true -> printfn "x is true"
дает предупреждение
C: \ Program Files (x86) \ Microsoft VS Code \ Untitled-1 (2,7): предупреждение FS0025: Неполные совпадения шаблонов в этом выражении. Например, значение «false» может указывать на случай, не охваченный шаблоном (-ами).
Это связано с тем, что не все возможные значения bool были покрыты.
bools могут быть явно указаны, но ints сложнее перечислять
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
здесь мы используем специальный символ _
. _
Соответствует всем другим возможным случаям.
_
Может вызвать у вас неприятности
рассмотрим тип, который мы создаем, он выглядит так
type Sobriety =
| Sober
| Tipsy
| Drunk
Мы могли бы написать матч с выпиской, который выглядит так
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Вышеприведенный код имеет смысл. Мы предполагаем, что если вы не трезвы, вам следует назвать uber, поэтому мы используем _
чтобы обозначить, что
Позднее мы реорганизуем наш код на этот
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
Компилятор F # должен дать нам предупреждение и пригласить нас реорганизовать наше выражение соответствия, чтобы человек обратился за медицинской помощью. Вместо этого выражение матча бесшумно относится к бессознательному человеку, как если бы они были только подвыпившими. Дело в том, что вы должны выбрать, чтобы в явном виде перечислять случаи, когда это возможно, чтобы избежать логических ошибок.
Случаи оцениваются сверху донизу и используется первое совпадение
Неправильное использование:
В следующем фрагменте последний матч никогда не будет использоваться:
let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"
печать
x - это то, что не было указано выше
Правильное использование:
Здесь как x = 1
и x = 4
попадут в их конкретные случаи, а все остальное попадет в случай по умолчанию _
:
let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"
печать
x равно 4
Когда охранники позволяют добавлять произвольные условные обозначения
type Person = {
Age : int
PassedDriversTest : bool }
let someone = { Age = 19; PassedDriversTest = true }
match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"