Поделиться через


Параметры

Тип параметра в 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.
IsNone bool Возвращает true, если параметр имеет значение None.
IsSome bool Возвращает true, если параметр имеет значение, которое не None.
Some 'T option Статический элемент, который создает параметр, имеющий значение, которое не None.
значение 'T Возвращает базовое значение или выбрасывает System.NullReferenceException, если значение None.

Модуль опций

Существует модуль, параметр, который содержит полезные функции, выполняющие операции с параметрами. Некоторые функции повторяют функциональные возможности свойств, но полезны в контекстах, где требуется функция. 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.

Преобразование параметров со значениями по умолчанию

Помимо преобразования в списки и массивы, параметры можно преобразовать в другие типы, предоставив значения по умолчанию с помощью функции Option.defaultValue. Это особенно полезно, если вы хотите убедиться, что значение не None. Например:

let optionString = Some("F#")
let defaultString = optionString |> Option.defaultValue ""
// defaultString is "F#"

let optionInt = None
let defaultInt = optionInt |> Option.defaultValue 0
// defaultInt is 0

Функция Option.defaultValue позволяет обрабатывать как Some, так и None варианты без сопоставления шаблонов.

См. также