📜  F#-选项

📅  最后修改于: 2020-11-21 06:38:53             🧑  作者: Mango


当变量或函数的值可能存在或不存在时,F#中的选项类型将用于计算。选项类型用于表示计算中的可选值。它们可以有两个可能的值-Some(x)None

例如,执行除法的函数在正常情况下将返回一个值,但在分母为零的情况下将引发异常。在此处使用选项将有助于指示函数是成功还是失败。

选项具有基础类型,可以容纳该类型的值,或者可能没有值。

使用选项

让我们以除法函数为例。以下程序对此进行了解释-

让我们编写一个函数div,并向其发送两个参数20和5-

let div x y = x / y
let res = div 20 5
printfn "Result: %d" res

编译并执行程序时,将产生以下输出-

Result: 4

如果第二个参数为零,则程序将引发异常-

let div x y = x / y
let res = div 20 0
printfn "Result: %d" res

编译并执行程序时,将产生以下输出-

Unhandled Exception:
System.DivideByZeroException: Division by zero

在这种情况下,我们可以使用选项类型在操作成功时返回Some(值),或者在操作失败时返回None。

以下示例演示了选项的用法-

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res

编译并执行程序时,将产生以下输出-

Result: Some 5

选项属性和方法

选项类型支持以下属性和方法-

Property or method Type Description
None ‘T option A static property that enables you to create an option value that has the None value.
IsNone bool Returns true if the option has the None value.
IsSome bool Returns true if the option has a value that is not None.
Some ‘T option A static member that creates an option that has a value that is not None.
Value ‘T Returns the underlying value, or throws a NullReferenceException if the value is None.

例子1

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

let res : int option = checkPositive(-31)
printfn "Result: %A " res

编译并执行程序时,将产生以下输出-

Result: 

例子2

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value

编译并执行程序时,将产生以下输出-

Result: Some 5
Result: 5

例子3

let isHundred = function
   | Some(100) -> true
   | Some(_) | None -> false

printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)

编译并执行程序时,将产生以下输出-

false
true
false