Параметры (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 поддерживает следующие свойства и методы.
Свойство или метод |
Тип |
Описание |
---|---|---|
'T option |
Статическое свойство, позволяющее создать значение типа option, имеющее значение None. |
|
bool |
Возвращает значение true, если параметр типа option имеет значение None. |
|
bool |
Возвращает значение true, если параметр типа option имеет значение, отличное от None. |
|
'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.