跳轉到內容

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

請注意 divsafediv 函式之間的一個重要區別

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

Option 模組中的其他函式

[編輯 | 編輯原始碼]

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,否則不執行任何操作。
上一個:高階函式 索引 下一個:元組和記錄
華夏公益教科書