aboutsummaryrefslogtreecommitdiff
path: root/lessons/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2023-12-12 13:04:55 +0000
committerLouis Pilfold <louis@lpil.uk>2023-12-12 13:04:55 +0000
commit819cc743eba34cdd25e25f3c6ba5891a8cb6077d (patch)
treedd6454f3ec7ed3c878da0450475a209d2864e0f6 /lessons/src
parente660bc6a4eb2b7537e33617df9b411ef07a894d7 (diff)
downloadtour-819cc743eba34cdd25e25f3c6ba5891a8cb6077d.tar.gz
tour-819cc743eba34cdd25e25f3c6ba5891a8cb6077d.zip
List functions
Diffstat (limited to 'lessons/src')
-rw-r--r--lessons/src/lesson020_lists/code.gleam16
-rw-r--r--lessons/src/lesson020_lists/text.html19
-rw-r--r--lessons/src/lesson021_list_functions/code.gleam15
-rw-r--r--lessons/src/lesson021_list_functions/text.html25
4 files changed, 75 insertions, 0 deletions
diff --git a/lessons/src/lesson020_lists/code.gleam b/lessons/src/lesson020_lists/code.gleam
new file mode 100644
index 0000000..646ad6e
--- /dev/null
+++ b/lessons/src/lesson020_lists/code.gleam
@@ -0,0 +1,16 @@
+import gleam/io
+
+pub fn main() {
+ let ints = [1, 2, 3]
+
+ io.debug(ints)
+
+ // Immutably prepend
+ io.debug([-1, 0, ..ints])
+
+ // Uncomment this to see the error
+ // io.debug(["zero", ..ints])
+
+ // The original lists are unchanged
+ io.debug(ints)
+}
diff --git a/lessons/src/lesson020_lists/text.html b/lessons/src/lesson020_lists/text.html
new file mode 100644
index 0000000..dd07cd7
--- /dev/null
+++ b/lessons/src/lesson020_lists/text.html
@@ -0,0 +1,19 @@
+<p>
+ Lists are ordered collections of values.
+</p>
+<p>
+ <code>List</code> is a generic type, having a type parameter
+ for the type of values it contains. A list of ints has the type
+ <code>List(Int)</code>, and a list of strings has the type
+ <code>List(String)</code>.
+</p>
+<p>
+ Lists are immutable single-linked lists, meaning they are very efficient to
+ add and remove elements from the front of the list.
+</p>
+<p>
+ Counting the length of a list or getting elements from other positions in the
+ list is expensive and rarely done. It is rare to write algorithms that index
+ into sequences in Gleam, but but when they are written a list is not the right
+ choice of data structure.
+</p>
diff --git a/lessons/src/lesson021_list_functions/code.gleam b/lessons/src/lesson021_list_functions/code.gleam
new file mode 100644
index 0000000..8cd4ced
--- /dev/null
+++ b/lessons/src/lesson021_list_functions/code.gleam
@@ -0,0 +1,15 @@
+import gleam/io
+import gleam/list
+
+pub fn main() {
+ let ints = [0, 1, 2, 3, 4, 5]
+
+ let doubled = list.map(ints, fn(x) { x * 2 })
+ io.debug(doubled)
+
+ let even = list.filter(ints, fn(x) { x % 2 == 0 })
+ io.debug(even)
+
+ let total = list.fold(ints, from: 0, with: fn(count, e) { count + e })
+ io.debug(total)
+}
diff --git a/lessons/src/lesson021_list_functions/text.html b/lessons/src/lesson021_list_functions/text.html
new file mode 100644
index 0000000..e143654
--- /dev/null
+++ b/lessons/src/lesson021_list_functions/text.html
@@ -0,0 +1,25 @@
+<p>
+ The <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html"><code>gleam/list</code></a>
+ standard library module contains functions for working with lists. A Gleam
+ program will likely make heavy use of this module.
+</p>
+
+<p>
+ <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#map"><code>map</code></a>
+ makes a new list by running a function on each element in a list.
+</p>
+<p>
+ <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#filter"><code>filter</code></a>
+ makes a new list containing only the elements for which a function returns
+ true.
+</p>
+<p>
+ <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#fold"><code>fold</code></a>
+ combines all the elements in a list into a single value by running a function
+ left-to-right on each element, passing the result of the previous call to the
+ next call.
+</p>
+<p>
+ It's worth getting familiar with all the functions in this module when writing
+ Gleam code.
+</p>