aboutsummaryrefslogtreecommitdiff
path: root/src/content/chapter1_functions/lesson06_generic_functions
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2024-01-18 16:44:27 +0000
committerLouis Pilfold <louis@lpil.uk>2024-01-18 16:44:27 +0000
commitf92661980deac22b54e79cd44c25caba17910c95 (patch)
tree165923d00aab8e7a5d5944d388dbb182c6d57b51 /src/content/chapter1_functions/lesson06_generic_functions
parente35f26eb4a034aad8a531986bf876075ffb02e3c (diff)
downloadtour-f92661980deac22b54e79cd44c25caba17910c95.tar.gz
tour-f92661980deac22b54e79cd44c25caba17910c95.zip
Last of the content!
Diffstat (limited to 'src/content/chapter1_functions/lesson06_generic_functions')
-rw-r--r--src/content/chapter1_functions/lesson06_generic_functions/code.gleam19
-rw-r--r--src/content/chapter1_functions/lesson06_generic_functions/text.html25
2 files changed, 44 insertions, 0 deletions
diff --git a/src/content/chapter1_functions/lesson06_generic_functions/code.gleam b/src/content/chapter1_functions/lesson06_generic_functions/code.gleam
new file mode 100644
index 0000000..e232bf8
--- /dev/null
+++ b/src/content/chapter1_functions/lesson06_generic_functions/code.gleam
@@ -0,0 +1,19 @@
+import gleam/io
+
+pub fn main() {
+ let add_one = fn(x) { x + 1 }
+ let exclaim = fn(x) { x <> "!" }
+
+ // Invalid, Int and String are not the same type
+ // twice(10, exclaim)
+
+ // Here the type variable is replaced by the type Int
+ io.debug(twice(10, add_one))
+
+ // Here the type variable is replaced by the type String
+ io.debug(twice("Hello", exclaim))
+}
+
+fn twice(argument: value, function: fn(value) -> value) -> value {
+ function(function(argument))
+}
diff --git a/src/content/chapter1_functions/lesson06_generic_functions/text.html b/src/content/chapter1_functions/lesson06_generic_functions/text.html
new file mode 100644
index 0000000..1369c93
--- /dev/null
+++ b/src/content/chapter1_functions/lesson06_generic_functions/text.html
@@ -0,0 +1,25 @@
+<p>
+ Up until now each function has accepted precisely one type for each of its
+ arguments.
+</p>
+<p>
+ The <code>twice</code> function for example only worked with functions that
+ would take and return ints. This is overly restrictive, it should be possible
+ to use this function with any type, so long as the function and the initial
+ value are compatible.
+</p>
+<p>
+ To enable this Gleam support <em>generics</em>, also known as <em>parametric
+ polymorphism</em>.
+</p>
+<p>
+ This works by instead of specifying a concrete type, a type variable is used
+ which stands in for whatever specific type is being used when the function is
+ called. These type variable are written with a lowercase name.
+</p>
+<p>
+ Type variables are not like an <code>any</code> type, they get replaced with a
+ specific type each time the function is called. Try uncommenting
+ <code>twice(10, exclaim)</code> to see the compiler error from trying to use a
+ type variable as an int and a string at the same time.
+</p>