Параметры
Тип параметра в 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.forall
Option.exists
, Option.foldBack
, Option.fold
и Option.count
. Эти функции позволяют использовать такие параметры, как коллекция нулевых или одного элемента. Дополнительные сведения и примеры см. в обсуждении функций коллекции в списках.
Преобразование в другие типы
Параметры можно преобразовать в списки или массивы. При преобразовании параметра в любую из этих структур данных результирующая структура данных имеет ноль или один элемент. Чтобы преобразовать параметр в массив, используйте Option.toArray
. Чтобы преобразовать параметр в список, используйте Option.toList
.