F #: сопоставление с образцом по базовым типам - PullRequest
0 голосов
/ 05 мая 2018

У меня есть ряд функций проверки, которые я хочу поместить в массив для выполнения:

type result = {D: int; E: int; F: int; G: int}

type InvalidReason =
| AAA
| BBB
| CCC
| DDD
| EEE

type Validation =
| Valid
| Invalid of InvalidReason

let validators = [|AAA; BBB; CCC; DDD; EEE|]

let validateStuff result =
    validators
    |> Array.map(fun v -> v result)
    |> Array.contains(Validation.Invalid _)

Проблема в том, что последняя строка кода. Я получаю «Неожиданное значение _ в выражении». Следующее работает

|> Array.contains(Validation.Valid)
|> Array.contains(Validation.Invalid InvalidReason.AAA)

Но я не хочу описывать каждый из подтипов для InvalidReasons. Есть ли какой-то синтаксис, который я пропускаю?

1 Ответ

0 голосов
/ 05 мая 2018

Функция Array.contains принимает значение и проверяет, есть ли это значение в массиве. То, что вы пытаетесь сделать, это дать целую кучу значений для проверки. Ну, это не сработает: функция берет только один. И не помогает то, что в F # такого синтаксиса нет: -)

Вы можете использовать другую функцию, которая принимает несколько значений, но лучший способ выполнить то, что вы хотите, это использовать функцию, которая принимает предикат - Array.exists. Сделайте себе предикат, чтобы проверить, является ли значение «недействительным»:

let isInvalid x = match x with
    | Valid -> false
    | Invalid _ -> true

И передать его Array.exists:

let validateStuff result = 
    validators 
    |> Array.map(fun v -> v result) 
    |> Array.exists isInvalid

Или вы могли бы даже поместить эту функцию в строку:

let validateStuff result = 
    validators 
    |> Array.map(fun v -> v result) 
    |> Array.exists ( fun x -> match x with
            | Valid -> false
            | Invalid _ -> true )

Или еще короче, используя ключевое слово function:

let validateStuff result = 
    validators 
    |> Array.map(fun v -> v result) 
    |> Array.exists ( function | Valid -> false | Invalid _ -> true )

Или даже короче, избавляясь от максимально возможного шума:

let validateStuff result = 
    validators 
    |> Array.map(fun v -> v result) 
    |> Array.exists ( function Invalid _ -> true | _ -> false )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...