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


Параметры (F#)

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

Заметки

В следующем примере кода демонстрируется использование типа option.

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

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

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

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

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

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.

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

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, если было создано исключение.В зависимости от ситуации, может потребоваться не перехватывать исключение, а позволить ему распространяться дальше.

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

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

Свойство или метод

Тип

Описание

None

'T option

Статическое свойство, позволяющее создать значение типа option, имеющее значение None.

IsNone

bool

Возвращает значение true, если параметр типа option имеет значение None.

IsSome

bool

Возвращает значение true, если параметр типа option имеет значение, отличное от None.

Some

'T option

Статический член, создающий параметр, который имеет значение, отличное от None.

Значение

'T

Возвращает базовое значение или создает исключение NullReferenceException, если значение равно None.

Модуль Option

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

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

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

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

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

См. также

Другие ресурсы

Справочник по языку F#

Типы языка F#