Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

list

list is a type used to represent a linked list data structure. Every list is either Pair and contains two values (head, tail) or is Nil, and contains 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'>=&gt;</span> <span class='hljs-punctuation'>(</span><span class='hljs-type'>Pair</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-type'>Nil</span>

Functions


Nil: (list::t '0)

The constructor for an empty list item. This should only be located at the end of a list.

Example

<span class='hljs-keyword'>let</span> my_empty_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil

Pair: ('0 * (list::t '0)) -> (list::t '0)

The constructor for a non-empty list item

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Pair</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"item"</span><span class='hljs-punctuation'>,</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil<span class='hljs-punctuation'>)</span>

push: '0 -> (list::t '0) -> (list::t '0)

Creates a copy of the passed list with the passed element appended to the end.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</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-comment'>(* my_list: Nil *)</span>
<span class='hljs-keyword'>let</span> my_new_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"item"</span> my_list 
<span class='hljs-comment'>(* my_new_list: "item" &gt; Nil *)</span>

iterate: ('0 -> unit) -> (list::t '0) -> ()

Runs the passed operation on each element of the passed list, but doesn't create or return a new one.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"Hello"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>" World!"</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>iterate</span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span>println my_list
<span class='hljs-comment'>(* prints "Hello World!" *)</span>

map: ('0 -> '1) -> (list::t '0) -> (list::t '1)

Creates and returns a new list by applying the passed operation to each element in the passed list.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</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'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>3</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>4</span> 
<span class='hljs-comment'>(* my_list: 3 &gt; 4 &gt; Nil *)</span>
<span class='hljs-keyword'>let</span> my_mapped_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>map</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=&gt;</span> a <span class='hljs-operator'>*</span> <span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span> my_list
<span class='hljs-comment'>(* my_mapped_list: 6 &gt; 8 &gt; Nil *)</span>

length: (list::t '0) -> integer

Returns the length of the passed list.

Example

<span class='hljs-keyword'>let</span> length = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>0</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>1</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>length</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>format</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>integer</span> length <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>println</span>
<span class='hljs-comment'>(* prints 2 *)</span>

nth: integer -> (list::t '0) -> '0

Returns the value of the passed list item at the position of the passed index.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"one"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"two"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"three"</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>nth</span> <span class='hljs-variable constant_'>2</span> my_list <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>println</span>
<span class='hljs-comment'>(* prints "two" *)</span>

concatenate: (list::t '0) -> (list::t '0) -> (list::t '0)

Adds the second passed list to the end of the first passed list.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"one"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"two"</span> 
<span class='hljs-keyword'>let</span> my_second_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span>Nil <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"three"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-string'>"four"</span> 
<span class='hljs-keyword'>let</span> my_final_list = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>concatenate</span> my_list my_second_list
<span class='hljs-comment'>(* my_list: "one" &gt; "two" &gt; Nil *)</span>
<span class='hljs-comment'>(* my_second_list: "three" &gt; "four" &gt; Nil *)</span>
<span class='hljs-comment'>(* my_final_list: "one" &gt; "two" &gt; "three" &gt; "four" &gt; Nil*)</span>

fold: ('0 -> '1 -> '0) -> '0 -> (list::t '1) -> '0

Reduces the passed list to a single element using the passed function.

Example

<span class='hljs-keyword'>let</span> my_list = <span class='hljs-title class_'>list</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'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>1</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>2</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>push</span> <span class='hljs-variable constant_'>3</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>list</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>fold</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'>=&gt;</span> <span class='hljs-keyword'>if</span> a <span class='hljs-operator'>&lt;</span> b <span class='hljs-keyword'>then</span> a <span class='hljs-keyword'>else</span> b<span class='hljs-punctuation'>)</span> <span class='hljs-variable constant_'>10</span> my_list <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>format</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>integer</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>println</span>
<span class='hljs-comment'>(* prints 1 *)</span>