mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
22 lines
No EOL
13 KiB
HTML
22 lines
No EOL
13 KiB
HTML
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCKTree (containers.iter.CCKTree)</title><link rel="stylesheet" href="../../odoc.css"/><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><meta name="generator" content="doc-ock-html v1.0.0-1-g1fc9bf0"/></head><body><nav id="top"><a href="../index.html">Up</a> — <span class="package">package <a href="../index.html">containers.iter</a></span></nav><header><h1><span class="keyword">Module</span> <span class="module-path">CCKTree</span></h1></header><h2>Lazy Tree Structure</h2><p>
|
|
This structure can be used to represent trees and directed
|
|
graphs (as infinite trees) in a lazy fashion. Like <a href="../CCKList/index.html">CCKList</a>, it
|
|
is a structural type.</p><div class="spec type" id="type-sequence"><a href="#type-sequence" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a sequence</code><code><span class="keyword"> = </span>(<span class="type-var">'a</span> <span class="keyword">‑></span> unit) <span class="keyword">‑></span> unit</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-gen"><a href="#type-gen" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a gen</code><code><span class="keyword"> = </span>unit <span class="keyword">‑></span> <span class="type-var">'a</span> option</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-klist"><a href="#type-klist" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a klist</code><code><span class="keyword"> = </span>unit <span class="keyword">‑></span> [ `Nil | `Cons of <span class="type-var">'a</span><span class="keyword"> * </span><span class="type-var">'a</span> <a href="index.html#type-klist">klist</a> ]</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-printer"><a href="#type-printer" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a printer</code><code><span class="keyword"> = </span>Format.formatter <span class="keyword">‑></span> <span class="type-var">'a</span> <span class="keyword">‑></span> unit</code><code></code></div><div class="doc"></div></div><h3>Basics</h3><div class="spec type" id="type-t"><a href="#type-t" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>+'a t</code><code><span class="keyword"> = </span>unit <span class="keyword">‑></span> [ `Nil | `Node of <span class="type-var">'a</span><span class="keyword"> * </span><span class="type-var">'a</span> <a href="index.html#type-t">t</a> list ]</code><code></code></div><div class="doc"></div></div><div class="spec val" id="val-empty"><a href="#val-empty" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>empty : <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-is_empty"><a href="#val-is_empty" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_empty : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> bool</code></div><div class="doc"></div></div><div class="spec val" id="val-singleton"><a href="#val-singleton" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>singleton : <span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Tree with only one label.</p></div></div><div class="spec val" id="val-node"><a href="#val-node" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>node : <span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> list <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Build a node from a label and a list of children.</p></div></div><div class="spec val" id="val-node1"><a href="#val-node1" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>node1 : <span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Node with one child.</p></div></div><div class="spec val" id="val-node2"><a href="#val-node2" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>node2 : <span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Node with two children.</p></div></div><div class="spec val" id="val-fold"><a href="#val-fold" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>fold : (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span> <span class="keyword">‑></span> <span class="type-var">'a</span>) <span class="keyword">‑></span> <span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span></code></div><div class="doc"><p>Fold on values in no specified order. May not terminate if the
|
|
tree is infinite.</p></div></div><div class="spec val" id="val-iter"><a href="#val-iter" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>iter : (<span class="type-var">'a</span> <span class="keyword">‑></span> unit) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> unit</code></div><div class="doc"></div></div><div class="spec val" id="val-size"><a href="#val-size" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>size : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> int</code></div><div class="doc"><p>Number of elements.</p></div></div><div class="spec val" id="val-height"><a href="#val-height" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>height : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> int</code></div><div class="doc"><p>Length of the longest path to empty leaves.</p></div></div><div class="spec val" id="val-map"><a href="#val-map" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>map : (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span>) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-(>|=)"><a href="#val-(>|=)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(>|=) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span>) <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-cut_depth"><a href="#val-cut_depth" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>cut_depth : int <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Cut the tree at the given depth, so it becomes finite.</p></div></div><h3>Graph Traversals</h3><div class="spec class-type" id="class-type-pset"><a href="#class-type-pset" class="anchor"></a><div class="def class-type"><code><span class="keyword">class type </span>'a <a href="class-pset/index.html">pset</a> = <span class="keyword">object</span> ... <span class="keyword">end</span></code></div><div class="doc"><p>Abstract Set structure</p></div></div><div class="spec val" id="val-set_of_cmp"><a href="#val-set_of_cmp" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>set_of_cmp : cmp:(<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'a</span> <span class="keyword">‑></span> int) <span class="keyword">‑></span> unit <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#class-type-pset">pset</a></code></div><div class="doc"><p>Build a set structure given a total ordering.</p></div></div><div class="spec val" id="val-dfs"><a href="#val-dfs" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>dfs : pset:<span class="type-var">'a</span> <a href="index.html#class-type-pset">pset</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> [ `Enter of <span class="type-var">'a</span> | `Exit of <span class="type-var">'a</span> ] <a href="index.html#type-klist">klist</a></code></div><div class="doc"><p>Depth-first traversal of the tree.</p></div></div><div class="spec val" id="val-bfs"><a href="#val-bfs" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>bfs : pset:<span class="type-var">'a</span> <a href="index.html#class-type-pset">pset</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-klist">klist</a></code></div><div class="doc"><p>Breadth-first traversal of the tree.</p></div></div><div class="spec val" id="val-force"><a href="#val-force" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>force : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> [ `Nil | `Node of <span class="type-var">'a</span><span class="keyword"> * </span><span class="type-var">'b</span> list ]<span class="keyword"> as </span>b</code></div><div class="doc"><p><code class="code">force t</code> evaluates <code class="code">t</code> completely and returns a regular tree
|
|
structure.</p><ul class="at-tag"><li><span class="at-tag since">Since</span>: 0.13</li></ul></div></div><div class="spec val" id="val-find"><a href="#val-find" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>find : pset:<span class="type-var">'a</span> <a href="index.html#class-type-pset">pset</a> <span class="keyword">‑></span> (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span> option) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'b</span> option</code></div><div class="doc"><p>Look for an element that maps to <code class="code">Some _</code>.</p></div></div><h3>Pretty-printing</h3><p>Example (tree of calls for naive Fibonacci function):
|
|
</p><pre><code class="code"> let mk_fib n =
|
|
let rec fib' l r i =
|
|
if i=n then r else fib' r (l+r) (i+1)
|
|
in fib' 1 1 1;;
|
|
|
|
let rec fib n = match n with
|
|
| 0 | 1 -> CCKTree.singleton (`Cst n)
|
|
| _ -> CCKTree.node2 (`Plus (mk_fib n)) (fib (n-1)) (fib (n-2));;
|
|
|
|
let pp_node fmt = function
|
|
| `Cst n -> Format.fprintf fmt "%d" n
|
|
| `Plus n -> Format.fprintf fmt "%d" n;;
|
|
|
|
Format.printf "%a@." (CCKTree.pp pp_node) (fib 8);;</code></pre><div class="spec val" id="val-pp"><a href="#val-pp" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>pp : <span class="type-var">'a</span> <a href="index.html#type-printer">printer</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <a href="index.html#type-printer">printer</a></code></div><div class="doc"><p>A pretty-printer using S-expressions and boxes to render the tree.
|
|
Empty nodes are not rendered; sharing is ignored.</p><ul class="at-tag"><li><span class="at-tag since">Since</span>: 0.9</li></ul></div></div><h3>Pretty printing in the DOT (graphviz) format</h3><div class="spec module" id="module-Dot"><a href="#module-Dot" class="anchor"></a><div class="def module"><code><span class="keyword">module </span><a href="Dot/index.html">Dot</a> : <span class="keyword">sig</span> ... <span class="keyword">end</span></code></div><div class="doc"></div></div></body></html> |