Логические паттерны

Последнее обновление: 14.12.2023

Логические паттерны позволяют использовать операторы & и | для других паттернов. Операция & представляет паттерн AND и указывает, что выражение должно соответствовать сразу обоим паттерна этой операции. Операция | представляет паттерн OR и указывает, что выражение должно соответствовать хотя бы одному из двух паттернов этой операции.

Например, используем паттер OR:

// перечисление описывает статус пользователя
type UserStatus = 
    | Admin = 0
    | Moderator = 1
    | User = 2

// проверяем статус
let checkStatus status = 
    match status with
    | UserStatus.Admin | UserStatus.Moderator -> "Доступ разрешен"   // если статус - админ или модератор
    | _ -> "Доступ запрещен"          // в остальных случаях

printfn "%s" (checkStatus UserStatus.Admin)     // Доступ разрешен
printfn "%s" (checkStatus UserStatus.Moderator)     // Доступ разрешен
printfn "%s" (checkStatus UserStatus.User)     // Доступ запрещен

Здесь определено перечисление UserStatus, которое описывает статус пользователя - он может быть администратором, моделатором или просто пользователем. И в зависимости от этого меняются права пользователя в системе. Для проверки статуса определена функция checkStatus. Если статус представляет значения UserStatus.Admin или UserStatus.Moderator, то возвращаем одно сообщение. В остальных случаях возвращаем другое сообщение.

Причем объединяемые паттерны могут быть более сложные. Например, кортежи:

type UserStatus = 
    | Admin = 0
    | Moderator = 1
    | User = 2

let checkStatus user = 
    match user with
    | (_, UserStatus.Admin) | (_, UserStatus.Moderator) -> "Доступ разрешен"
    | _ -> "Доступ запрещен"

printfn "%s" (checkStatus ("Tom", UserStatus.Admin))
printfn "%s" (checkStatus ("Bob", UserStatus.Moderator)) 
printfn "%s" (checkStatus ("Sam", UserStatus.User))   

Здесь аналогичная ситуация, только теперь в фукцию передается кортеж из имени и статуса пользователя. Для проверки статуса имя пользователя может быть не важно, поэтому для проверки статуса применяем паттерн (_, UserStatus.Admin) | (_, UserStatus.Moderator)

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850