F# - 选项
当变量或函数可能存在或不存在值时,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 (value) ,在操作失败时返回 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
选项属性和方法
选项类型支持以下属性和方法 −
属性或方法 | 类型 | 描述 |
---|---|---|
None | 'T option | 一个静态属性,使您能够创建具有None value的选项值。 |
IsNone | bool | 如果选项具有None值,则返回true。 |
IsSome | bool | 如果选项的值不是None,则返回true。 |
Some | 'T option | 一个静态成员,创建一个值不是None的选项。 |
Value | 'T | 返回基础值,如果值为None,则抛出 NullReferenceException。 |
示例 1
let checkPositive (a : int) = if a> 0 then Some(a) else None let res : int option = checkPositive(-31) printfn "Result: %A " res
当您编译并执行该程序时,它会产生以下输出 −
Result: <null>
示例 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