ocaml-containers/dev/containers/CCRandom/index.html
2023-11-13 19:39:32 +00:00

17 lines
33 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCRandom (containers.CCRandom)</title><link rel="stylesheet" href="../../_odoc-theme/odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.3.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> &#x00BB; CCRandom</nav><header class="odoc-preamble"><h1>Module <code><span>CCRandom</span></code></h1><p>Random Generators</p></header><nav class="odoc-toc"><ul><li><a href="#basic-functions">Basic functions</a></li><li><a href="#advanced-functions">Advanced functions</a><ul><li><a href="#applicative">Applicative</a></li><li><a href="#run-a-generator">Run a generator</a></li></ul></li></ul></nav><div class="odoc-content"><h2 id="basic-functions"><a href="#basic-functions" class="anchor"></a>Basic functions</h2><div class="odoc-spec"><div class="spec value anchored" id="val-init"><a href="#val-init" class="anchor"></a><code><span><span class="keyword">val</span> init : <span>int <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Initialize the generator, using the argument as a seed. The same seed will always yield the same sequence of numbers.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-full_init"><a href="#val-full_init" class="anchor"></a><code><span><span class="keyword">val</span> full_init : <span><span>int array</span> <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Same as <code>Random.init</code> but takes more data as seed.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-self_init"><a href="#val-self_init" class="anchor"></a><code><span><span class="keyword">val</span> self_init : <span>unit <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Initialize the generator with a random seed chosen in a system-dependent way. If <code>/dev/urandom</code> is available on the host machine, it is used to provide a highly random initial seed. Otherwise, a less random seed is computed from system parameters (current time, process IDs).</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-bits"><a href="#val-bits" class="anchor"></a><code><span><span class="keyword">val</span> bits : <span>unit <span class="arrow">&#45;&gt;</span></span> int</span></code></div><div class="spec-doc"><p>Return 30 random bits in a nonnegative integer.</p><ul class="at-tags"><li class="before"><span class="at-tag">before</span> <span class="value">3.12.0</span> <p>used a different algorithm (affects all the following functions)</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-full_int"><a href="#val-full_int" class="anchor"></a><code><span><span class="keyword">val</span> full_int : <span>int <span class="arrow">&#45;&gt;</span></span> int</span></code></div><div class="spec-doc"><p><code>Random.full_int bound</code> returns a random integer between 0 (inclusive) and <code>bound</code> (exclusive). <code>bound</code> may be any positive integer.</p><p>If <code>bound</code> is less than 2<sup>30</sup>, <code>Random.full_int bound</code> is equal to <code>Random.int</code><code> bound</code>. If <code>bound</code> is greater than 2<sup>30</sup> (on 64-bit systems or non-standard environments, such as JavaScript), <code>Random.full_int</code> returns a value, where <code>Random.int</code> raises <code>Invalid_argument</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 4.13.0</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-int32"><a href="#val-int32" class="anchor"></a><code><span><span class="keyword">val</span> int32 : <span><a href="../../ocaml/Stdlib/Int32/index.html#type-t">Stdlib.Int32.t</a> <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Int32/index.html#type-t">Stdlib.Int32.t</a></span></code></div><div class="spec-doc"><p><code>Random.int32 bound</code> returns a random integer between 0 (inclusive) and <code>bound</code> (exclusive). <code>bound</code> must be greater than 0.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-nativeint"><a href="#val-nativeint" class="anchor"></a><code><span><span class="keyword">val</span> nativeint : <span><a href="../../ocaml/Stdlib/Nativeint/index.html#type-t">Stdlib.Nativeint.t</a> <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Nativeint/index.html#type-t">Stdlib.Nativeint.t</a></span></code></div><div class="spec-doc"><p><code>Random.nativeint bound</code> returns a random integer between 0 (inclusive) and <code>bound</code> (exclusive). <code>bound</code> must be greater than 0.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-int64"><a href="#val-int64" class="anchor"></a><code><span><span class="keyword">val</span> int64 : <span><a href="../../ocaml/Stdlib/Int64/index.html#type-t">Stdlib.Int64.t</a> <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Int64/index.html#type-t">Stdlib.Int64.t</a></span></code></div><div class="spec-doc"><p><code>Random.int64 bound</code> returns a random integer between 0 (inclusive) and <code>bound</code> (exclusive). <code>bound</code> must be greater than 0.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-bool"><a href="#val-bool" class="anchor"></a><code><span><span class="keyword">val</span> bool : <span>unit <span class="arrow">&#45;&gt;</span></span> bool</span></code></div><div class="spec-doc"><p><code>Random.bool ()</code> returns <code>true</code> or <code>false</code> with probability 0.5 each.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-bits32"><a href="#val-bits32" class="anchor"></a><code><span><span class="keyword">val</span> bits32 : <span>unit <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Int32/index.html#type-t">Stdlib.Int32.t</a></span></code></div><div class="spec-doc"><p><code>Random.bits32 ()</code> returns 32 random bits as an integer between <code>Int32.min_int</code> and <code>Int32.max_int</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 4.14.0</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-bits64"><a href="#val-bits64" class="anchor"></a><code><span><span class="keyword">val</span> bits64 : <span>unit <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Int64/index.html#type-t">Stdlib.Int64.t</a></span></code></div><div class="spec-doc"><p><code>Random.bits64 ()</code> returns 64 random bits as an integer between <code>Int64.min_int</code> and <code>Int64.max_int</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 4.14.0</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-nativebits"><a href="#val-nativebits" class="anchor"></a><code><span><span class="keyword">val</span> nativebits : <span>unit <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Nativeint/index.html#type-t">Stdlib.Nativeint.t</a></span></code></div><div class="spec-doc"><p><code>Random.nativebits ()</code> returns 32 or 64 random bits (depending on the bit width of the platform) as an integer between <code>Nativeint.min_int</code> and <code>Nativeint.max_int</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 4.14.0</li></ul></div></div><h2 id="advanced-functions"><a href="#advanced-functions" class="anchor"></a>Advanced functions</h2><p>The functions from module <a href="State/index.html"><code>State</code></a> manipulate the current state of the random generator explicitly. This allows using one or several deterministic PRNGs, even in a multi-threaded program, without interference from other parts of the program.</p><div class="odoc-spec"><div class="spec module anchored" id="module-State"><a href="#module-State" class="anchor"></a><code><span><span class="keyword">module</span> State</span><span> = <a href="../../ocaml/Stdlib/Random/State/index.html">Stdlib.Random.State</a></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-get_state"><a href="#val-get_state" class="anchor"></a><code><span><span class="keyword">val</span> get_state : <span>unit <span class="arrow">&#45;&gt;</span></span> <a href="../../ocaml/Stdlib/Random/State/index.html#type-t">State.t</a></span></code></div><div class="spec-doc"><p>Return the current state of the generator used by the basic functions.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-set_state"><a href="#val-set_state" class="anchor"></a><code><span><span class="keyword">val</span> set_state : <span><a href="../../ocaml/Stdlib/Random/State/index.html#type-t">State.t</a> <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Set the state of the generator used by the basic functions.</p></div></div><div class="odoc-spec"><div class="spec type anchored" id="type-state"><a href="#type-state" class="anchor"></a><code><span><span class="keyword">type</span> state</span><span> = <a href="../../ocaml/Stdlib/Random/State/index.html#type-t">Stdlib.Random.State.t</a></span></code></div></div><div class="odoc-spec"><div class="spec type anchored" id="type-t"><a href="#type-t" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a t</span></span><span> = <span><a href="#type-state">state</a> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p>Random generator for values of type <code>'a</code>.</p></div></div><div class="odoc-spec"><div class="spec type anchored" id="type-random_gen"><a href="#type-random_gen" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a random_gen</span></span><span> = <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-return"><a href="#val-return" class="anchor"></a><code><span><span class="keyword">val</span> return : <span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>return x</code> is the generator that always returns <code>x</code>. Example: <code>let random_int = return 4 (* fair dice roll *)</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-flat_map"><a href="#val-flat_map" class="anchor"></a><code><span><span class="keyword">val</span> flat_map : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>flat_map f g st</code> is <code>f (g st) st</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-(&gt;&gt;=)"><a href="#val-(&gt;&gt;=)" class="anchor"></a><code><span><span class="keyword">val</span> (&gt;&gt;=) : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Monadic <code>bind</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-map"><a href="#val-map" class="anchor"></a><code><span><span class="keyword">val</span> map : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'b</span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>map f g st</code> is <code>f (g st)</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-(&gt;|=)"><a href="#val-(&gt;|=)" class="anchor"></a><code><span><span class="keyword">val</span> (&gt;|=) : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'b</span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-delay"><a href="#val-delay" class="anchor"></a><code><span><span class="keyword">val</span> delay : <span><span>(<span>unit <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Delay evaluation. Useful for side-effectful generators that need some code to run for every call. Example:</p><pre class="language-ocaml"><code>let gensym = let r = ref 0 in fun () -&gt; incr r; !r ;;
delay (fun () -&gt;
let name = gensym() in
small_int &gt;&gt;= fun i -&gt; return (name,i)
)</code></pre><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.4</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-choose"><a href="#val-choose" class="anchor"></a><code><span><span class="keyword">val</span> choose : <span><span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Choose a generator within the list.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-choose_exn"><a href="#val-choose_exn" class="anchor"></a><code><span><span class="keyword">val</span> choose_exn : <span><span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Like <a href="#val-choose"><code>choose</code></a> but without option.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <code>Invalid_argument</code> <p>if the list is empty.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-choose_array"><a href="#val-choose_array" class="anchor"></a><code><span><span class="keyword">val</span> choose_array : <span><span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> array</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Choose a generator within the array.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-choose_return"><a href="#val-choose_return" class="anchor"></a><code><span><span class="keyword">val</span> choose_return : <span><span><span class="type-var">'a</span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Choose among the list.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <code>Invalid_argument</code> <p>if the list is empty.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-replicate"><a href="#val-replicate" class="anchor"></a><code><span><span class="keyword">val</span> replicate : <span>int <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> list</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>replicate n g</code> makes a list of <code>n</code> elements which are all generated randomly using <code>g</code>.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-sample_without_duplicates"><a href="#val-sample_without_duplicates" class="anchor"></a><code><span><span class="keyword">val</span> sample_without_duplicates :
<span><span class="label">cmp</span>:<span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> int)</span> <span class="arrow">&#45;&gt;</span></span>
<span>int <span class="arrow">&#45;&gt;</span></span>
<span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span>
<span><span><span class="type-var">'a</span> list</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>sample_without_replacement n g</code> makes a list of <code>n</code> elements which are all generated randomly using <code>g</code> with the added constraint that none of the generated random values are equal.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <code>Invalid_argument</code> <p>if <code>n &lt;= 0</code>.</p></li></ul><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 2.4</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-list_seq"><a href="#val-list_seq" class="anchor"></a><code><span><span class="keyword">val</span> list_seq : <span><span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> list</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Build random lists from lists of random generators.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.4</li></ul></div></div><div class="odoc-spec"><div class="spec exception anchored" id="exception-Pick_from_empty"><a href="#exception-Pick_from_empty" class="anchor"></a><code><span><span class="keyword">exception</span> </span><span><span class="exception">Pick_from_empty</span></span></code></div><div class="spec-doc"><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-pick_list"><a href="#val-pick_list" class="anchor"></a><code><span><span class="keyword">val</span> pick_list : <span><span><span class="type-var">'a</span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Pick an element at random from the list.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <a href="#exception-Pick_from_empty"><code>Pick_from_empty</code></a> <p>if the list is empty.</p></li></ul><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-pick_array"><a href="#val-pick_array" class="anchor"></a><code><span><span class="keyword">val</span> pick_array : <span><span><span class="type-var">'a</span> array</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Pick an element at random from the array.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <a href="#exception-Pick_from_empty"><code>Pick_from_empty</code></a> <p>if the array is empty.</p></li></ul><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-small_int"><a href="#val-small_int" class="anchor"></a><code><span><span class="keyword">val</span> small_int : <span>int <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>A small int (100).</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-int"><a href="#val-int" class="anchor"></a><code><span><span class="keyword">val</span> int : <span>int <span class="arrow">&#45;&gt;</span></span> <span>int <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Random int within the given range.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-int_range"><a href="#val-int_range" class="anchor"></a><code><span><span class="keyword">val</span> int_range : <span>int <span class="arrow">&#45;&gt;</span></span> <span>int <span class="arrow">&#45;&gt;</span></span> <span>int <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Inclusive range.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-small_float"><a href="#val-small_float" class="anchor"></a><code><span><span class="keyword">val</span> small_float : <span>float <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>A reasonably small float (100.0).</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.6.1</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-float"><a href="#val-float" class="anchor"></a><code><span><span class="keyword">val</span> float : <span>float <span class="arrow">&#45;&gt;</span></span> <span>float <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Random float within the given range.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.6.1</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-float_range"><a href="#val-float_range" class="anchor"></a><code><span><span class="keyword">val</span> float_range : <span>float <span class="arrow">&#45;&gt;</span></span> <span>float <span class="arrow">&#45;&gt;</span></span> <span>float <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Inclusive range. <code>float_range a b</code> assumes <code>a &lt; b</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.6.1</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-split"><a href="#val-split" class="anchor"></a><code><span><span class="keyword">val</span> split : <span>int <span class="arrow">&#45;&gt;</span></span> <span><span><span>(int * int)</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Split a positive value <code>n</code> into <code>n1,n2</code> where <code>n = n1 + n2</code>.</p><ul class="at-tags"><li class="returns"><span class="at-tag">returns</span> <p><code>None</code> if the value is too small.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-split_list"><a href="#val-split_list" class="anchor"></a><code><span><span class="keyword">val</span> split_list : <span>int <span class="arrow">&#45;&gt;</span></span> <span><span class="label">len</span>:int <span class="arrow">&#45;&gt;</span></span> <span><span><span>int list</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Split a value <code>n</code> into a list of values whose sum is <code>n</code> and whose length is <code>length</code>. The list is never empty and does not contain <code>0</code>.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <code>Invalid_argument</code> <p>if <code>len &lt;= 1</code>.</p></li></ul><ul class="at-tags"><li class="returns"><span class="at-tag">returns</span> <p><code>None</code> if the value is too small.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-retry"><a href="#val-retry" class="anchor"></a><code><span><span class="keyword">val</span> retry : <span><span class="optlabel">?max</span>:int <span class="arrow">&#45;&gt;</span></span> <span><span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>retry g</code> calls <code>g</code> until it returns some value, or until the maximum number of retries was reached. If <code>g</code> fails, then it counts for one iteration, and the generator retries.</p><ul class="at-tags"><li class="parameter"><span class="at-tag">parameter</span> <span class="value">max:</span> <p>maximum number of retries. Default <code>10</code>.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-try_successively"><a href="#val-try_successively" class="anchor"></a><code><span><span class="keyword">val</span> try_successively : <span><span><span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span> list</span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>try_successively l</code> tries each generator of <code>l</code>, one after the other. If some generator succeeds its result is returned, else the next generator is tried.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-(&lt;?&gt;)"><a href="#val-(&lt;?&gt;)" class="anchor"></a><code><span><span class="keyword">val</span> (&lt;?&gt;) : <span><span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> option</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p><code>a &lt;?&gt; b</code> is a choice operator. It first tries <code>a</code>, and returns its result if successful. If <code>a</code> fails, then <code>b</code> is returned.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-fix"><a href="#val-fix" class="anchor"></a><code><span><span class="keyword">val</span> fix :
<span><span class="optlabel">?sub1</span>:<span><span>(<span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span>)</span> list</span> <span class="arrow">&#45;&gt;</span></span>
<span><span class="optlabel">?sub2</span>:<span><span>(<span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span>)</span> list</span> <span class="arrow">&#45;&gt;</span></span>
<span><span class="optlabel">?subn</span>:<span><span>(<span>int <a href="#type-t">t</a></span> * <span>(<span><span><span><span class="type-var">'a</span> list</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span>)</span>)</span> list</span> <span class="arrow">&#45;&gt;</span></span>
<span><span class="label">base</span>:<span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span>
<span><span>int <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span>
<span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Recursion combinators, for building recursive values. The integer generator is used to provide fuel. The <code>sub_</code> generators should use their arguments only once!</p><ul class="at-tags"><li class="parameter"><span class="at-tag">parameter</span> <span class="value">sub1</span> <p>cases that recurse on one value.</p></li></ul><ul class="at-tags"><li class="parameter"><span class="at-tag">parameter</span> <span class="value">sub2</span> <p>cases that use the recursive gen twice.</p></li></ul><ul class="at-tags"><li class="parameter"><span class="at-tag">parameter</span> <span class="value">subn</span> <p>cases that use a list of recursive cases.</p></li></ul></div></div><h5 id="applicative"><a href="#applicative" class="anchor"></a>Applicative</h5><div class="odoc-spec"><div class="spec value anchored" id="val-pure"><a href="#val-pure" class="anchor"></a><code><span><span class="keyword">val</span> pure : <span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-(&lt;*&gt;)"><a href="#val-(&lt;*&gt;)" class="anchor"></a><code><span><span class="keyword">val</span> (&lt;*&gt;) : <span><span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'b</span>)</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></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 class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'b</span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-and+"><a href="#val-and+" class="anchor"></a><code><span><span class="keyword">val</span> and+ : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'b</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span class="type-var">'a</span> * <span class="type-var">'b</span>)</span> <a href="#type-t">t</a></span></span></code></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 class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span><span class="type-var">'a</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span>)</span> <span class="arrow">&#45;&gt;</span></span> <span><span class="type-var">'b</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-and*"><a href="#val-and*" class="anchor"></a><code><span><span class="keyword">val</span> and* : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'b</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span><span>(<span class="type-var">'a</span> * <span class="type-var">'b</span>)</span> <a href="#type-t">t</a></span></span></code></div></div><h5 id="run-a-generator"><a href="#run-a-generator" class="anchor"></a>Run a generator</h5><div class="odoc-spec"><div class="spec value anchored" id="val-run"><a href="#val-run" class="anchor"></a><code><span><span class="keyword">val</span> run : <span><span class="optlabel">?st</span>:<a href="#type-state">state</a> <span class="arrow">&#45;&gt;</span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">&#45;&gt;</span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p>Using a random state (possibly the one in argument) run a generator.</p></div></div></div></body></html>