F# 编程/可选类型
外观
< F# 编程
F#:可选类型 |
可选类型可以保存两个可能的值:Some(x)
或 None
。可选类型通常用于表示计算中的可选值,或指示特定计算是否成功。
假设我们有一个将两个整数相除的函数。通常情况下,我们会按如下方式编写函数
let div x y = x / y
这个函数运行良好,但并不安全:有可能将无效值传递给此函数,导致运行时错误。以下是在 fsi 中的演示
> let div x y = x / y;;
val div : int -> int -> int
> div 10 5;;
val it : int = 2
> div 10 0;;
System.DivideByZeroException: Attempted to divide by zero.
at <StartupCode$FSI_0035>.$FSI_0035._main()
stopped due to error
div 10 5
正常执行,但 div 10 0
会抛出除零异常。
使用可选类型,我们可以在计算成功时返回 Some(value)
,或在计算失败时返回 None
> let safediv x y =
match y with
| 0 -> None
| _ -> Some(x/y);;
val safediv : int -> int -> int option
> safediv 10 5;;
val it : int option = Some 2
> safediv 10 0;;
val it : int option = None
请注意 div
和 safediv
函数之间的一个重要区别
val div : int -> int -> int
val safediv : int -> int -> int option
div
返回一个 int
,而 safediv
返回一个 int option
。由于我们的 safediv
函数返回不同的数据类型,因此它向客户端告知我们的函数已进入无效状态。
可选类型在概念上类似于 C# 等语言中的可空类型,但 F# 可选类型不使用 CLR System.Nullable<T>
在 IL 中表示,因为语义存在差异。
模式匹配可选类型与创建它们一样容易:用于声明可选类型的语法也用于匹配可选类型
> let isFortyTwo = function
| Some(42) -> true
| Some(_) | None -> false;;
val isFortyTwo : int option -> bool
> isFortyTwo (Some(43));;
val it : bool = false
> isFortyTwo (Some(42));;
val it : bool = true
> isFortyTwo None;;
val it : bool = false
val get : 'a option -> 'a
- 返回
Some
可选类型的 value。
val isNone : 'a option -> bool
- 对于
None
可选类型返回true
,否则返回false
。
val isSome : 'a option -> bool
- 对于
Some
可选类型返回true
,否则返回false
。
val map : ('a -> 'b) -> 'a option -> 'b option
- 对于
None
返回None
。对于Some(x)
返回Some(f x)
,其中f
是给定的映射函数。
val iter : ('a -> unit) -> 'a option -> unit
- 将给定函数应用于
Some
可选类型的 value,否则不执行任何操作。