module Fun:sig
..end
函式操作。
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
例外。