Варианты

Тип параметра в F # используется, если фактическое значение для именованного значения или переменной может не существовать. Параметр имеет базовый тип и может содержать значение этого типа или не может иметь значения.

Комментарии

В следующем коде показана функция, которая создает тип параметра.

let keepIfPositive (a : int) = if a > 0 then Some(a) else None

Как видите, создается значение, если входные данные a больше 0 Some(a) . В противном случае None создается.

Значение None используется, если параметр не имеет фактического значения. В противном случае выражение Some( ... ) дает параметру значение. Значения Some и None полезны при сопоставлении шаблонов, как в следующей функции exists , которая возвращает, true Если параметр имеет значение, а false Если нет.

let exists (x : int option) =
    match x with
    | Some(x) -> true
    | None -> false

Использование параметров

Параметры обычно используются, если поиск не возвращает соответствующий результат, как показано в следующем коде.

let rec tryFindMatch pred list =
    match list with
    | head :: tail -> if pred(head)
                        then Some(head)
                        else tryFindMatch pred tail
    | [] -> None

// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]

// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]

В приведенном выше коде рекурсивный поиск по списку выполняется рекурсивно. Функция tryFindMatch принимает функцию предиката pred , которая возвращает логическое значение, и список для поиска. Если найден элемент, удовлетворяющий предикату, рекурсия завершается, а функция возвращает значение в виде параметра в выражении Some(head) . Рекурсия завершается при сопоставлении пустого списка. В этот момент значение head не было найдено и None возвращается.

Многие функции библиотеки F #, которые выполняют поиск в коллекции значений, которые могут быть или не существуют, возвращают option тип. По соглашению эти функции начинаются с try префикса, например Seq.tryFindIndex .

Параметры также могут быть полезны, если значение может не существовать, например, если возможно, что при попытке создания значения возникнет исключение. Это показано в следующем примере кода.

open System.IO
let openFile filename =
    try
        let file = File.Open (filename, FileMode.Create)
        Some(file)
    with
        | ex -> eprintf "An exception occurred with message %s" ex.Message
                None

openFileФункция в предыдущем примере имеет тип string -> File option , так как она возвращает File объект, если файл открыт успешно, и None Если возникает исключение. В зависимости от ситуации может не подходить к перехвату исключения, а не разрешать его распространение.

Кроме того, по-прежнему можно передать null или значение, равное NULL, в Some случае параметра. Обычно это следует избегать, и обычно это выполняется в обычной программе программирования на F #, но это возможно из-за природы ссылочных типов в .NET.

Свойства и методы параметров

Тип параметра поддерживает следующие свойства и методы.

Свойство или метод Тип Описание
None 'T option Статическое свойство, которое позволяет создать значение параметра, имеющее None значение.
Не задано bool Возвращает, true Если параметр имеет None значение.
Часть bool Возвращает true , если параметр имеет значение, не равное None .
Некоторые 'T option Статический член, создающий параметр, который имеет значение, не равное None .
Значение 'T Возвращает базовое значение или создает исключение, System.NullReferenceException Если значение равно None .

Модуль параметров

Существует модуль, параметр, содержащий полезные функции, которые выполняют операции с параметрами. Некоторые функции позволяют повторить функциональность свойств, но они полезны в контекстах, где требуется функция. Option. some и Option. None являются функциями модуля, которые проверяют, содержит ли параметр значение. Параметр. Get получает значение, если таковое имеется. Если значение отсутствует, вызывается исключение System.ArgumentException .

Функция Option. Bind выполняет функцию для значения, если имеется значение. Функция должна принимать ровно один аргумент, и ее тип параметра должен быть типом параметра. Возвращаемое значение функции является другим типом параметра.

Модуль Option также включает функции, которые соответствуют функциям, доступным для списков, массивов, последовательностей и других типов коллекций. К этим функциям относятся Option.map ,,,, Option.iter Option.forall Option.exists Option.foldBack , Option.fold и Option.count . Эти функции позволяют использовать параметры как коллекцию с нулевым или одним элементом. Дополнительные сведения и примеры см. в обсуждении функций сбора в списках.

Преобразование в другие типы

Параметры можно преобразовать в списки или массивы. При преобразовании параметра в любую из этих структур данных Результирующая структура данных не может содержать ни одного элемента. Чтобы преобразовать параметр в массив, используйте Option.toArray . Чтобы преобразовать параметр в список, используйте Option.toList .

См. также