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