Fun(3) OCaml library Fun(3)

# [NAME](#NAME)

Fun - Function manipulation.

# [Module](#Module)

Module Fun

# [Documentation](#Documentation)

Module **Fun**  
: **sig end**

Function manipulation.

**Since** 4.08

## [Combinators](#Combinators)

*val id* : **'a -&gt; 'a**

**id** is the identity function. For any argument **x** , **id x** is **x** .

*val const* : **'a -&gt; 'b -&gt; 'a**

**const c** is a function that always returns the value **c** . For any argument **x** , **(const c) x** is **c** .

*val flip* : **('a -&gt; 'b -&gt; 'c) -&gt; 'b -&gt; 'a -&gt; 'c**

**flip f** reverses the argument order of the binary function **f** . For any arguments **x** and **y** , **(flip f) x y** is **f y x** .

*val negate* : **('a -&gt; bool) -&gt; 'a -&gt; bool**

**negate p** is the negation of the predicate function **p** . For any argument **x** , **(negate p) x** is **not (p x)** .

## [Exception handling](#Exception_handling)

*val protect* : **finally:(unit -&gt; unit) -&gt; (unit -&gt; 'a) -&gt; 'a**

**protect ~finally work** invokes **work ()** and then **finally ()** before **work ()** returns with its value or an exception. In the latter case the exception is re-raised after **finally ()** . If **finally ()** raises an exception, then the exception **Fun.Finally\_raised** is raised instead.

**protect** can be used to enforce local invariants whether **work ()** returns normally or raises an exception. However, it does not protect against unexpected exceptions raised inside **finally ()** such as **Out\_of\_memory** , **Stack\_overflow** , or asynchronous exceptions raised by signal handlers (e.g. **Sys.Break** ).

Note: It is a programming error if other kinds of exceptions are raised by **finally** , as any exception raised in **work ()** will be lost in the event of a **Fun.Finally\_raised** exception. Therefore, one should make sure to handle those inside the finally.

*exception Finally\_raised* **of** **exn**

**Finally\_raised exn** is raised by **protect ~finally work** when **finally** raises an exception **exn** . This exception denotes either an unexpected exception or a programming error. As a general rule, one should not catch a **Finally\_raised** exception except as part of a catch-all handler.

2026-09-15 OCamldoc

---

Document: Fun(3o) from ocaml-4 4.14.4-r3 (Chainguard OS)
Source: https://github.com/ocaml/ocaml
