Параметры

Тип параметра в 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.

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

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

Свойство или метод Тип Описание
None 'T option Статический член, который создает значение параметра, которое имеет None значение .
IsNone bool Возвращает значение true , если параметр имеет None значение .
IsSome bool Возвращает значение true , если параметр имеет значение, не Noneравное .
Some 'T option Статический член, который создает параметр со значением, не Noneравным .
Значение 'T Возвращает базовое значение или вызывает System.NullReferenceException , если значение равно None.

Модуль option

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

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

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

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

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

См. также