module Fun: Fun
val id : 'a -> 'a
id
是恆等函數。對於任何參數 x
,id x
為 x
。
val const : 'a -> 'b -> 'a
const c
是一個總是返回值 c
的函數。對於任何參數 x
,(const c) x
為 c
。
val compose : ('b -> 'c) -> ('a -> 'b) -> 'a -> 'c
compose f g
是一個函數組合,先應用 g
再應用 f
。對於任何參數 f
、g
和 x
,compose f g x
為 f (g x)
。
val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
flip f
反轉二元函數 f
的參數順序。對於任何參數 x
和 y
,(flip f) x y
為 f y x
。
val negate : ('a -> bool) -> 'a -> bool
negate p
是謂詞函數 p
的否定。對於任何參數 x
,(negate p) x
為 not (p x)
。
val protect : finally:(unit -> unit) -> (unit -> 'a) -> 'a
protect ~finally work
呼叫 work ()
,然後在 work ()
返回其值或拋出例外之前呼叫 finally ()
。在後者的情況下,例外會在 finally ()
之後重新拋出。如果 finally ()
拋出例外,則會改為拋出例外 Fun.Finally_raised
。
protect
可用於強制執行局部不變性,無論 work ()
正常返回還是拋出例外。然而,它無法防範在 finally ()
內部拋出的意外例外,例如 Out_of_memory
、Stack_overflow
或訊號處理常式拋出的非同步例外(例如 Sys.Break
)。
注意:如果 finally
拋出其他種類的例外,則是一個程式設計錯誤,因為在發生 Fun.Finally_raised
例外的情況下,work ()
中拋出的任何例外都將會遺失。因此,應確保在 finally 內部處理這些例外。
exception Finally_raised of exn
Finally_raised exn
在 finally
拋出例外 exn
時由 protect ~finally work
拋出。此例外表示意外的例外或程式設計錯誤。一般來說,不應捕獲 Finally_raised
例外,除非作為全域捕獲處理常式的一部分。