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
异常,除非作为通用处理程序的一部分。