Tracks
/
Gleam
Gleam
/
Exercises
/
Betty's Bike Shop
Betty's Bike Shop

Betty's Bike Shop

Learning Exercise

Introduction

Ints

There are two different kinds of numbers in Gleam - ints and floats.

Ints are whole numbers.

let integer = 3
// -> 3

Gleam has several operators that work with ints.

1 + 1 // -> 2
5 - 1 // -> 4
5 / 2 // -> 2
3 * 3 // -> 9
5 % 2 // -> 1

2 > 1  // -> True
2 < 1  // -> False
2 >= 1 // -> True
2 <= 1 // -> False

Floats

Floats are numbers with one or more digits behind the decimal separator.

let float = 3.45
// -> 3.45

Floats also have their own set of operators.

1.0 +. 1.4 // -> 2.4
5.0 -. 1.5 // -> 3.5
5.0 /. 2.0 // -> 2.5
3.0 *. 3.1 // -> 9.3

2.0 >. 1.0  // -> True
2.0 <. 1.0  // -> False
2.0 >=. 1.0 // -> True
2.0 <=. 1.0 // -> False

Modules

Modules

Gleam code is organised into modules, and each file is one Gleam module.

Up until now we have written functions with the pub fn syntax, which defines a function that is publicly available to other modules. Functions defined with fn are private to the module they are defined in and cannot be used by other modules.

// This function is public
pub fn add(x, y) {
  x + y
}

// This function is private
fn subtract(x, y) {
  x - y
}

Gleam modules have names, and the name is based on their file path within the src or test directory.

For example, a module defined in src\geometry\rectangle.gleam (on Windows) or src/geometry/rectangle.gleam (on UNIX-like operating systems) would be named geometry/rectangle.

Importing functions from other modules

Accessing functions defined in other modules is done via imports. All functions within that module that were exposed by it are made accessible when importing that module. But how they are accessed varies depending on how the module is imported.

Qualified imports are the default, and accessing a function within such module (for example the map function in the gleam/list module) is done by prefixing the module name (list.map).

// Import the int module
import gleam/int

pub fn run(x: Int) -> String {
  // Use the to_string function from the int module
  int.to_string(x)
}

By default the name used to refer to the module is the last part of the module name, in this case int, but this can be changed by using the as keyword.

// Import the int module and refer to it as i
import gleam/int as i

pub fn run(x: Int) -> String {
  i.to_string(x)
}

Unqualified imports enable direct access to the exposed functions within that module, without prefixing.

// Import the to_string function from the int module
import gleam/int.{to_string}

pub fn run(x: Int) -> String {
  to_string(x)
}

Qualified imports are preferred as they make it clearer to the reader where a function comes from, and to avoid name clashes.

Standard library

Gleam has a rich and well-documented standard library. The documentation is available online at hexdocs.pm/gleam_stdlib. Save this link somewhere - you will use it a lot!

Most built-in data types have a corresponding module that offers functions for working with that data type, e.g. there's the gleam/int module for ints, gleam/string module for strings, gleam/list module for lists and so on.

Instructions

In this exercise you're going to write some code to help Betty's Bike Shop, an online shop for bikes and parts. You have three tasks, aiming at correctly displaying the bikes and parts prices on the website.

1. Export the pence_to_pounds function

Your colleague has already written the skeleton of the module, the incomplete functions pence_to_pounds and pounds_to_string. However, they have forgotten to export the pence_to_pounds function, so it is currently not visible by other modules or by the test suite.

Export the pence_to_pounds function.

2. Convert pence to pounds

Currently, the price is stored as an integer number of pence (the bike shop is based in the UK). On the website, we want to show the price in pounds, where 1.00 pound amounts to 100 pence. Your first task is to implement the pence_to_pounds function, taking an Int amount of pence, and converting it into its equivalent pounds as a Float. You should also add type annotations for that function.

pence_to_pounds(106)
// -> 1.06

3. Format the price for display on the website

Since Betty's bikes are sold in pounds, prices should be displayed with the symbol "£". Your second task is thus to implement the pounds_to_string function, taking an amount of pounds as a Float and returning its price displayed as a String with the pound symbol prepended.

You should import the gleam/float and gleam/string modules before using them.

You should also define the type annotation for pounds_to_string.

pounds_to_string(1.06)
// -> "£1.06"
Edit via GitHub The link opens in a new window or tab
Gleam Exercism

Ready to start Betty's Bike Shop?

Sign up to Exercism to learn and master Gleam with 33 concepts, 122 exercises, and real human mentoring, all for free.