Параметры

Тип параметра в 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является.
Value 'T Возвращает базовое значение или создает System.NullReferenceException значение, если значение равно None.

Модуль Option

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

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

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

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

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

См. также