mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
4 lines
No EOL
19 KiB
HTML
4 lines
No EOL
19 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCFun (containers.CCFun)</title><link rel="stylesheet" href="../../_odoc-theme/odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.2.1"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><script src="../../highlight.pack.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body class="odoc"><nav class="odoc-nav"><a href="../index.html">Up</a> – <a href="../index.html">containers</a> » CCFun</nav><header class="odoc-preamble"><h1>Module <code><span>CCFun</span></code></h1><p>Basic operations on Functions</p></header><nav class="odoc-toc"><ul><li><a href="#combinators">Combinators</a></li><li><a href="#exception">Exception handling</a><ul><li><a href="#infix">Infix</a></li><li><a href="#monad">Monad</a></li></ul></li></ul></nav><div class="odoc-content"><h2 id="combinators"><a href="#combinators" class="anchor"></a>Combinators</h2><div class="odoc-spec"><div class="spec value external anchored" id="val-id"><a href="#val-id" class="anchor"></a><code><span><span class="keyword">val</span> id : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>id</code> is the identity function. For any argument <code>x</code>, <code>id x</code> is <code>x</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-const"><a href="#val-const" class="anchor"></a><code><span><span class="keyword">val</span> const : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">_</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>const c</code> is a function that always returns the value <code>c</code>. For any argument <code>x</code>, <code>(const c) x</code> is <code>c</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-flip"><a href="#val-flip" class="anchor"></a><code><span><span class="keyword">val</span> flip : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>flip f</code> reverses the argument order of the binary function <code>f</code>. For any arguments <code>x</code> and <code>y</code>, <code>(flip f) x y</code> is <code>f y x</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-negate"><a href="#val-negate" class="anchor"></a><code><span><span class="keyword">val</span> negate : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> bool)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> bool</span></code></div><div class="spec-doc"><p><code>negate p</code> is the negation of the predicate function <code>p</code>. For any argument <code>x</code>, <code>(negate p) x</code> is <code>not (p x)</code>.</p></div></div><h2 id="exception"><a href="#exception" class="anchor"></a>Exception handling</h2><div class="odoc-spec"><div class="spec value anchored" id="val-protect"><a href="#val-protect" class="anchor"></a><code><span><span class="keyword">val</span> protect : <span>finally:<span>(<span>unit <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> <span><span>(<span>unit <span class="arrow">-></span></span> <span class="type-var">'a</span>)</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>protect ~finally work</code> invokes <code>work ()</code> and then <code>finally ()</code> before <code>work ()</code> returns with its value or an exception. In the latter case the exception is re-raised after <code>finally ()</code>. If <code>finally ()</code> raises an exception, then the exception <a href="#exception-Finally_raised"><code>Finally_raised</code></a> is raised instead.</p><p><code>protect</code> can be used to enforce local invariants whether <code>work ()</code> returns normally or raises an exception. However, it does not protect against unexpected exceptions raised inside <code>finally ()</code> such as <a href="../../ocaml/Stdlib/index.html#exception-Out_of_memory"><code>Stdlib.Out_of_memory</code></a>, <a href="../../ocaml/Stdlib/index.html#exception-Stack_overflow"><code>Stdlib.Stack_overflow</code></a>, or asynchronous exceptions raised by signal handlers (e.g. <code>Sys</code>.Break).</p><p>Note: It is a <em>programming error</em> if other kinds of exceptions are raised by <code>finally</code>, as any exception raised in <code>work ()</code> will be lost in the event of a <a href="#exception-Finally_raised"><code>Finally_raised</code></a> exception. Therefore, one should make sure to handle those inside the finally.</p></div></div><div class="odoc-spec"><div class="spec exception anchored" id="exception-Finally_raised"><a href="#exception-Finally_raised" class="anchor"></a><code><span><span class="keyword">exception</span> </span><span><span class="exception">Finally_raised</span> <span class="keyword">of</span> exn</span></code></div><div class="spec-doc"><p><code>Finally_raised exn</code> is raised by <code>protect ~finally work</code> when <code>finally</code> raises an exception <code>exn</code>. This exception denotes either an unexpected exception or a programming error. As a general rule, one should not catch a <code>Finally_raised</code> exception except as part of a catch-all handler.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-compose"><a href="#val-compose" class="anchor"></a><code><span><span class="keyword">val</span> compose : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>compose f g x</code> is <code>g (f x)</code>. Composition.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-compose_binop"><a href="#val-compose_binop" class="anchor"></a><code><span><span class="keyword">val</span> compose_binop : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>compose_binop f g</code> is <code>fun x y -> g (f x) (f y)</code>. Example (partial order): <code>List.sort (compose_binop fst CCInt.compare) [1, true; 2, false; 1, false]</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.6</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-curry"><a href="#val-curry" class="anchor"></a><code><span><span class="keyword">val</span> curry : <span><span>(<span><span>(<span class="type-var">'a</span> * <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>curry f x y</code> is <code>f (x,y)</code>. Convert a function which accepts a pair of arguments into a function which accepts two arguments.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-uncurry"><a href="#val-uncurry" class="anchor"></a><code><span><span class="keyword">val</span> uncurry : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span>(<span class="type-var">'a</span> * <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>uncurry f (x,y)</code> is <code>f x y</code>. Convert a function which accepts a two arguments into a function which accepts a pair of arguments.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-tap"><a href="#val-tap" class="anchor"></a><code><span><span class="keyword">val</span> tap : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">_</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>tap f x</code> evaluates <code>f x</code>, discards it, then returns <code>x</code>. Useful in a pipeline, for instance:</p><pre class="language-ocaml"><code>CCArray.(1 -- 10)
|
||
|> tap CCArray.shuffle
|
||
|> tap @@ CCArray.sort Stdlib.compare</code></pre></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-lexicographic"><a href="#val-lexicographic" class="anchor"></a><code><span><span class="keyword">val</span> lexicographic : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> int)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> int)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>Lexicographic combination of comparison functions.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-finally"><a href="#val-finally" class="anchor"></a><code><span><span class="keyword">val</span> finally : <span>h:<span>(<span>unit <span class="arrow">-></span></span> <span class="type-var">_</span>)</span> <span class="arrow">-></span></span> <span>f:<span>(<span>unit <span class="arrow">-></span></span> <span class="type-var">'a</span>)</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>finally ~h f</code> calls <code>f ()</code> and returns its result. If it raises, the same exception is raised; in <b>any</b> case, <code>h ()</code> is called after <code>f ()</code> terminates. If <code>h ()</code> raises an exception, then this exception will be passed on and any exception that may have been raised by <code>f ()</code> is lost.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-finally1"><a href="#val-finally1" class="anchor"></a><code><span><span class="keyword">val</span> finally1 : <span>h:<span>(<span>unit <span class="arrow">-></span></span> <span class="type-var">_</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span></span></code></div><div class="spec-doc"><p><code>finally1 ~h f x</code> is the same as <code>f x</code>, but after the computation, <code>h ()</code> is called whether <code>f x</code> rose an exception or not. If <code>h ()</code> raises an exception, then this exception will be passed on and any exception that may have been raised by <code>f ()</code> is lost.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.16</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-finally2"><a href="#val-finally2" class="anchor"></a><code><span><span class="keyword">val</span> finally2 : <span>h:<span>(<span>unit <span class="arrow">-></span></span> <span class="type-var">_</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>finally2 ~h f x y</code> is the same as <code>f x y</code>, but after the computation, <code>h ()</code> is called whether <code>f x y</code> rose an exception or not. If <code>h ()</code> raises an exception, then this exception will be passed on and any exception that may have been raised by <code>f ()</code> is lost.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.16</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-opaque_identity"><a href="#val-opaque_identity" class="anchor"></a><code><span><span class="keyword">val</span> opaque_identity : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>opaque_identity x</code> is like <code>x</code>, but prevents Flambda from using <code>x</code>'s definition for optimizing it. (flambda is an optimization/inlining pass in OCaml >= 4.03).</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.18</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-iterate"><a href="#val-iterate" class="anchor"></a><code><span><span class="keyword">val</span> iterate : <span>int <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'a</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p><code>iterate n f</code> is <code>f</code> iterated <code>n</code> times. That is to say, <code>iterate 0 f x</code> is <code>x</code>, <code>iterate 1 f x</code> is <code>f x</code>, <code>iterate 2 f x</code> is <code>f (f x)</code>, etc.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 2.1</li></ul></div></div><h3 id="infix"><a href="#infix" class="anchor"></a>Infix</h3><p>Infix operators.</p><div class="odoc-spec"><div class="spec module anchored" id="module-Infix"><a href="#module-Infix" class="anchor"></a><code><span><span class="keyword">module</span> <a href="Infix/index.html">Infix</a></span><span> : <span class="keyword">sig</span> ... <span class="keyword">end</span></span></code></div></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <span class="keyword">module</span> <span class="keyword">type</span> <span class="keyword">of</span> <a href="Infix/index.html">Infix</a></span></code></summary><div class="odoc-spec"><div class="spec value anchored" id="val-(%>)"><a href="#val-(%>)" class="anchor"></a><code><span><span class="keyword">val</span> (%>) : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>(f %> g) x</code> or <code>(%>) f g x</code> is <code>g (f x)</code>. Alias to <code>compose</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-(%)"><a href="#val-(%)" class="anchor"></a><code><span><span class="keyword">val</span> (%) : <span><span>(<span><span class="type-var">'b</span> <span class="arrow">-></span></span> <span class="type-var">'c</span>)</span> <span class="arrow">-></span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'c</span></span></code></div><div class="spec-doc"><p><code>(f % g) x</code> or <code>(%) f g x</code> is <code>f (g x)</code>. Mathematical composition.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-let@"><a href="#val-let@" class="anchor"></a><code><span><span class="keyword">val</span> let@ : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span class="type-var">'b</span></span></code></div><div class="spec-doc"><p><code>let@ x = foo in bar</code> is the equivalent of <code>foo @@ fun x -> bar</code>. It can be very useful for resource management, alongside with <a href="#val-protect"><code>protect</code></a>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 3.11</li></ul></div></div></details></div><h3 id="monad"><a href="#monad" class="anchor"></a>Monad</h3><p>Functions with a fixed domain are monads in their codomain.</p><div class="odoc-spec"><div class="spec module anchored" id="module-Monad"><a href="#module-Monad" class="anchor"></a><code><span><span class="keyword">module</span> <a href="Monad/index.html">Monad</a></span><span> (<a href="Monad/argument-1-X/index.html">X</a> : <span class="keyword">sig</span> ... <span class="keyword">end</span>) : <span class="keyword">sig</span> ... <span class="keyword">end</span></span></code></div></div></div></body></html> |