Поиск…


замечания

Совместимость шаблонов - это мощная функция многих функциональных языков, поскольку она часто позволяет обрабатывать ветвление очень кратко по сравнению с использованием нескольких операторов 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"


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow