mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
15 lines
No EOL
15 KiB
HTML
15 lines
No EOL
15 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCKTree (containers-data.CCKTree)</title><link rel="stylesheet" href="../../odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.2.0"/><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-data</a> » CCKTree</nav><header class="odoc-preamble"><h1>Module <code><span>CCKTree</span></code></h1><p>Lazy Tree Structure This structure can be used to represent trees and directed graphs (as infinite trees) in a lazy fashion. Like <code>CCKList</code>, it is a structural type.</p></header><nav class="odoc-toc"><ul><li><a href="#basics">Basics</a></li><li><a href="#graph-traversals">Graph Traversals</a></li><li><a href="#pretty-printing">Pretty-printing</a></li><li><a href="#pretty-printing-in-the-dot-(graphviz)-format">Pretty printing in the DOT (graphviz) format</a></li></ul></nav><div class="odoc-content"><div class="odoc-spec"><div class="spec type anchored" id="type-iter"><a href="#type-iter" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a iter</span></span><span> = <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> unit</span></code></div></div><div class="odoc-spec"><div class="spec type anchored" id="type-gen"><a href="#type-gen" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a gen</span></span><span> = <span>unit <span class="arrow">-></span></span> <span><span class="type-var">'a</span> option</span></span></code></div></div><div class="odoc-spec"><div class="spec type anchored" id="type-printer"><a href="#type-printer" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a printer</span></span><span> = <span><span class="xref-unresolved">Stdlib</span>.Format.formatter <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> unit</span></code></div></div><h3 id="basics"><a href="#basics" class="anchor"></a>Basics</h3><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>unit <span class="arrow">-></span></span> <span>[ `Nil <span><span>| `Node</span> of <span class="type-var">'a</span> * <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> list</span></span> ]</span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-empty"><a href="#val-empty" class="anchor"></a><code><span><span class="keyword">val</span> empty : <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-is_empty"><a href="#val-is_empty" class="anchor"></a><code><span><span class="keyword">val</span> is_empty : <span><span><span class="type-var">_</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> bool</span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-singleton"><a href="#val-singleton" class="anchor"></a><code><span><span class="keyword">val</span> singleton : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Tree with only one label.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-node"><a href="#val-node" class="anchor"></a><code><span><span class="keyword">val</span> node : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> list</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Build a node from a label and a list of children.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-node1"><a href="#val-node1" class="anchor"></a><code><span><span class="keyword">val</span> node1 : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Node with one child.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-node2"><a href="#val-node2" class="anchor"></a><code><span><span class="keyword">val</span> node2 : <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Node with two children.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-fold"><a href="#val-fold" class="anchor"></a><code><span><span class="keyword">val</span> fold : <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">'a</span>)</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'b</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span class="type-var">'a</span></span></code></div><div class="spec-doc"><p>Fold on values in no specified order. May not terminate if the tree is infinite.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-iter"><a href="#val-iter" class="anchor"></a><code><span><span class="keyword">val</span> iter : <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> unit</span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-size"><a href="#val-size" class="anchor"></a><code><span><span class="keyword">val</span> size : <span><span><span class="type-var">_</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>Number of elements.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-height"><a href="#val-height" class="anchor"></a><code><span><span class="keyword">val</span> height : <span><span><span class="type-var">_</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>Length of the longest path to empty leaves.</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">-></span></span> <span class="type-var">'b</span>)</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></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-(>|=)"><a href="#val-(>|=)" class="anchor"></a><code><span><span class="keyword">val</span> (>|=) : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></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">'b</span> <a href="#type-t">t</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-cut_depth"><a href="#val-cut_depth" class="anchor"></a><code><span><span class="keyword">val</span> cut_depth : <span>int <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="#type-t">t</a></span></span></code></div><div class="spec-doc"><p>Cut the tree at the given depth, so it becomes finite.</p></div></div><h3 id="graph-traversals"><a href="#graph-traversals" class="anchor"></a>Graph Traversals</h3><div class="odoc-spec"><div class="spec class-type anchored" id="class-type-pset"><a href="#class-type-pset" class="anchor"></a><code><span><span class="keyword">class</span> <span class="keyword">type</span> 'a </span><span><a href="class-type-pset/index.html">pset</a></span><span> = <span class="keyword">object</span> ... <span class="keyword">end</span></span></code></div><div class="spec-doc"><p>Abstract Set structure</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-set_of_cmp"><a href="#val-set_of_cmp" class="anchor"></a><code><span><span class="keyword">val</span> set_of_cmp : <span>cmp:<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>unit <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <a href="class-type-pset/index.html">pset</a></span></span></code></div><div class="spec-doc"><p>Build a set structure given a total ordering.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-dfs"><a href="#val-dfs" class="anchor"></a><code><span><span class="keyword">val</span> dfs : <span>pset:<span><span class="type-var">'a</span> <a href="class-type-pset/index.html">pset</a></span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span>[ <span>`Enter of <span class="type-var">'a</span></span> <span><span>| `Exit</span> of <span class="type-var">'a</span></span> ]</span> <span class="xref-unresolved">Stdlib</span>.Seq.t</span></span></code></div><div class="spec-doc"><p>Depth-first traversal of the tree.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-bfs"><a href="#val-bfs" class="anchor"></a><code><span><span class="keyword">val</span> bfs : <span>pset:<span><span class="type-var">'a</span> <a href="class-type-pset/index.html">pset</a></span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> <span class="xref-unresolved">Stdlib</span>.Seq.t</span></span></code></div><div class="spec-doc"><p>Breadth-first traversal of the tree.</p></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-force"><a href="#val-force" class="anchor"></a><code><span><span class="keyword">val</span> force : <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span>[ `Nil <span><span>| `Node</span> of <span class="type-var">'a</span> * <span><span class="type-var">'b</span> list</span></span> ]</span> <span class="keyword">as</span> 'b</span></code></div><div class="spec-doc"><p><code>force t</code> evaluates <code>t</code> completely and returns a regular tree structure.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.13</li></ul></div></div><div class="odoc-spec"><div class="spec value anchored" id="val-find"><a href="#val-find" class="anchor"></a><code><span><span class="keyword">val</span> find : <span>pset:<span><span class="type-var">'a</span> <a href="class-type-pset/index.html">pset</a></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> option</span>)</span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <span class="arrow">-></span></span> <span><span class="type-var">'b</span> option</span></span></code></div><div class="spec-doc"><p>Look for an element that maps to <code>Some _</code>.</p></div></div><h3 id="pretty-printing"><a href="#pretty-printing" class="anchor"></a>Pretty-printing</h3><p>Example (tree of calls for naive Fibonacci function):</p><pre class="language-ocaml"><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="odoc-spec"><div class="spec value anchored" id="val-pp"><a href="#val-pp" class="anchor"></a><code><span><span class="keyword">val</span> pp : <span><span><span class="type-var">'a</span> <a href="#type-printer">printer</a></span> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> <a href="#type-t">t</a></span> <a href="#type-printer">printer</a></span></span></code></div><div class="spec-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-tags"><li class="since"><span class="at-tag">since</span> 0.9</li></ul></div></div><h3 id="pretty-printing-in-the-dot-(graphviz)-format"><a href="#pretty-printing-in-the-dot-(graphviz)-format" class="anchor"></a>Pretty printing in the DOT (graphviz) format</h3><div class="odoc-spec"><div class="spec module anchored" id="module-Dot"><a href="#module-Dot" class="anchor"></a><code><span><span class="keyword">module</span> <a href="Dot/index.html">Dot</a></span><span> : <span class="keyword">sig</span> ... <span class="keyword">end</span></span></code></div></div></div></body></html> |