btree
btree
is a type that represents a binary tree.
Every btree is either a Node that contains a value and two children (Node or Nil), or it is Nil and contans no values.
<span class='hljs-keyword'>type</span> t = <span class='hljs-keyword'>fn</span> <span class='hljs-type'>I</span> <span class='hljs-keyword'>=></span> <span class='hljs-punctuation'>(</span><span class='hljs-type'>Node</span> <span class='hljs-type'>of</span> <span class='hljs-type'>I</span><span class='hljs-punctuation'>,</span> <span class='hljs-punctuation'>(</span><span class='hljs-type'>t</span> <span class='hljs-type'>I</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>,</span> <span class='hljs-punctuation'>(</span><span class='hljs-type'>t</span> <span class='hljs-type'>I</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>)</span> | <span class='hljs-type'>Nil</span>
Functions
Nil: unit -> (btree '0)
The constructor for a Nil btree. This is used to represent an empty child.
Example
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> my_empty_tree = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span><span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span>
# <span class='hljs-keyword'>end</span>
Node: '0 * btree '0 * btree '0 -> btree '0
The constructor for a Node btree.
Example
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> my_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>Node <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>1</span><span class='hljs-punctuation'>,</span> <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span><span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>,</span> <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span><span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>)</span>
<span class='hljs-comment'>(* my_tree == 1
* / \
* nil nil
*)</span>
# <span class='hljs-keyword'>end</span>
insert: '0 -> ('0 -> '0 -> boolean) -> (btree '0) -> (btree '0)
Returns a copy of the passed tree with the passed value inserted according to the passed operation.
Notes
insert
checks if the function is true with the passed value and the current tree value, if it is, it will attempt to insert the passed value as the left child. Otherwise, it will attempt to insert the passed value as the right child. This process is repeateded recursively until a Node
has a Nil
child in the appropriate position.
Example
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> my_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>Node <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>5</span><span class='hljs-punctuation'>,</span> <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span><span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>,</span> <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span><span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> my_new_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>insert <span class='hljs-variable constant_'>2</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b<span class='hljs-punctuation'>)</span> my_tree
<span class='hljs-comment'>(* my_new_tree == 5
* / \
* 2
*)</span>
<span class='hljs-keyword'>let</span> my_newer_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>insert <span class='hljs-variable constant_'>7</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b<span class='hljs-punctuation'>)</span> my_new_tree
<span class='hljs-comment'>(* my_newer_tree == 5
* / \
* 2 7
* / \ / \
*)</span>
<span class='hljs-keyword'>let</span> my_newest_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>insert <span class='hljs-variable constant_'>9</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b<span class='hljs-punctuation'>)</span> my_newer_tree
<span class='hljs-comment'>(* my_newest_tree == 5
* / \
* 2 7
* / \ / \
* 9
*)</span>
# <span class='hljs-keyword'>end</span>
iterate_tree_df: ('0 -> unit) -> (btree '0) -> unit
Runs the passed function on each element in the tree depth-first, then returns unit.
Example
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> lt = <span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b
<span class='hljs-keyword'>let</span> my_tree = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>5</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>2</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>7</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>8</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>3</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>1</span> lt
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>iterate_tree_df</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=></span> string<span class='hljs-punctuation'>:</span>from_int <span class='hljs-operator'>|></span> <span class='hljs-title function_'>std</span><span class='hljs-punctuation'>:</span>print_string<span class='hljs-punctuation'>)</span> my_tree
<span class='hljs-comment'>(* my_tree == 5
* / \
* 2 7
* / \ / \
* 1 3 8
*)</span>
<span class='hljs-comment'>(* prints 123578 *)</span>
# <span class='hljs-keyword'>end</span>
iterate_tree_bf: ('0 -> unit) -> (btree '0) -> unit
Runs the passed function on each element in the tree breadth-first, then returns unit.
Example
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> lt = <span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b
<span class='hljs-keyword'>let</span> my_tree = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>5</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>2</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>7</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>8</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>3</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>1</span> lt
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>iterate_tree_bf</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=></span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span>from_int <span class='hljs-operator'>|></span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print_string</span><span class='hljs-punctuation'>)</span> my_tree
<span class='hljs-comment'>(* my_tree == 5
* / \
* 2 7
* / \ / \
* 1 3 8
*)</span>
<span class='hljs-comment'>(* prints 521378 *)</span>
# <span class='hljs-keyword'>end</span>
map_tree: ('0 -> '1) -> (btree '0) -> (btree '1)
Returns a copy of the passed tree with the passed function applied to each element.
Examples
# <span class='hljs-keyword'>module</span> demo =
<span class='hljs-keyword'>let</span> lt = <span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-params'>b</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'><</span> b
<span class='hljs-keyword'>let</span> my_tree = <span class='hljs-title class_'>btree</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Nil</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>5</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>2</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>7</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>8</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>3</span> lt <span class='hljs-operator'>|></span> <span class='hljs-variable constant_'>1</span> lt
<span class='hljs-comment'>(* my_tree == 5
* / \
* 2 7
* / \ / \
* 1 3 8
*)</span>
<span class='hljs-keyword'>let</span> my_mapped_tree = <span class='hljs-title function_'>btree</span><span class='hljs-punctuation'>:</span>map_tree <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=></span> a <span class='hljs-operator'>*</span> <span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span> my_tree
<span class='hljs-comment'>(* my_mapped_tree == 10
* / \
* 4 14
* / \ / \
* 2 6 16
*)</span>
# <span class='hljs-keyword'>end</span>