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 值的可选项值。
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
广告
© . All rights reserved.