📅  最后修改于: 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. |
let checkPositive (a : int) =
if a > 0 then
Some(a)
else
None
let res : int option = checkPositive(-31)
printfn "Result: %A " res
编译并执行程序时,将产生以下输出-
Result:
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
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