diff options
author | Louis Pilfold <louis@lpil.uk> | 2024-01-18 16:44:27 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2024-01-18 16:44:27 +0000 |
commit | f92661980deac22b54e79cd44c25caba17910c95 (patch) | |
tree | 165923d00aab8e7a5d5944d388dbb182c6d57b51 /src/content/chapter1_functions/lesson06_generic_functions | |
parent | e35f26eb4a034aad8a531986bf876075ffb02e3c (diff) | |
download | tour-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.gleam | 19 | ||||
-rw-r--r-- | src/content/chapter1_functions/lesson06_generic_functions/text.html | 25 |
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> |