Логические паттерны позволяют использовать операторы & и | для других паттернов. Операция & представляет паттерн 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)