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'>=></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" > 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'>|></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'>|></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'>|></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'>|></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 > 4 > 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'>=></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 > 8 > 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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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'>|></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" > "two" > Nil *)</span>
<span class='hljs-comment'>(* my_second_list: "three" > "four" > Nil *)</span>
<span class='hljs-comment'>(* my_final_list: "one" > "two" > "three" > "four" > 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'>|></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'>|></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'>|></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'>=></span> <span class='hljs-keyword'>if</span> a <span class='hljs-operator'><</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'>|></span> <span class='hljs-title class_'>format</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>integer</span> <span class='hljs-operator'>|></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>