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,否則不執行任何操作。