Parcours
/
Elm
Elm
/
Exercices
/
Le magasin de vélos de Betty
Le magasin de vélos de Betty

Le magasin de vélos de Betty

Exercice d'apprentissage

Introduction

Les bases 2

Exporte des fonctions

L'export de fonctions a été vu dans le premier concept, en voici un rapide rappel.

Chaque fichier Elm est un module et doit contenir une instruction module avant tout autre code.

Le nom d'un module doit correspondre à celui de son fichier : le module Calculator doit donc se trouver dans le fichier Calculator.elm, et le module Parser.Utils dans le fichier Parser/Utils.elm.

Tout ce qui est défini dans un module y reste dans une portée privée et n'est pas accessible depuis l'extérieur de ce module, sauf si c'est listé dans exposing.

-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)

six = 3 + 3

add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)

six = 3 + 3

add number1 number2 = number1 + number2

https://elm-lang.org/docs/syntax#modules

Importe des fonctions depuis d'autres modules

Pour accéder aux fonctions définies dans d'autres modules, on passe par des imports. Toutes les fonctions de ce module qui ont été exposées par celui-ci deviennent accessibles lorsqu'on importe ce module. Mais la façon d'y accéder varie selon la manière dont le module est importé.

Les imports qualifiés sont la valeur par défaut, et pour accéder à une fonction d'un tel module (par exemple la fonction map du module List), on fait précéder son nom de celui du module (List.map).

Les imports ouverts donnent un accès direct aux fonctions exposées de ce module, sans préfixe. Ils se font avec le mot-clé exposing, comme un miroir de celui utilisé pour les exports. Tu peux exposer toutes les fonctions disponibles (avec ..), ou seulement certaines (par exemple map).

Tu peux aussi importer des types et leurs constructeurs depuis d'autres modules, mais cela viendra dans un concept ultérieur.

On préfère les imports qualifiés, pour plus de clarté et pour éviter les conflits de noms.

-- qualified imports
import List                            -- List.map, List.foldl
import List as L                       -- L.map, L.foldl

-- open imports
import List exposing (..)              -- map, foldl, concat, ...
import List exposing ( map, foldl )    -- map, foldl, List.concat

https://elm-lang.org/docs/syntax#modules

Annotations de type

Les annotations de type s'écrivent name : parameter types -> return type, les types des paramètres étant eux aussi séparés par ->.

add : Int -> Int -> Int
add number1 number2 = number1 + number2

On peut utiliser des parenthèses pour définir les paramètres d'une fonction (qui sont eux-mêmes définis avec la même syntaxe, d'où la nécessité des parenthèses).

-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
    -- ...

https://elm-lang.org/docs/syntax#type-annotations

Les nombres

Elm propose deux types de nombres, définis par les types Int et Float. Int correspond à l'ensemble des entiers relatifs. Float correspond à l'ensemble des nombres réels, limité par la précision de l'ordinateur. Les opérations définies sur les nombres fonctionnent en général sur l'un ou l'autre type, mais pas en les mélangeant. Il existe des fonctions pour convertir de l'un à l'autre, comme toFloat, qui convertit un Int en Float, et round, floor, ceiling ou truncate, qui convertissent un Float en Int avec des sémantiques différentes.

https://package.elm-lang.org/packages/elm/core/latest/Basics#Int

Opérations sur les strings

Pour décrire des mots et des phrases dans le code, Elm dispose d'un type String natif. Les littéraux de string s'écrivent entre guillemets anglais, comme "Hello World!". Un opérateur de concaténation de strings ++ et un opérateur d'égalité == sont disponibles par défaut.

hello : String -> String
hello subject = "Hello " ++ subject

hello "World!" --> "Hello World!"

La plupart des autres fonctions sur les strings se trouvent dans le module String, qu'il faut importer.

https://package.elm-lang.org/packages/elm/core/latest/String

Instructions

Dans cet exercice, tu vas écrire du code pour aider Betty's Bike Shop, une boutique en ligne de vélos et de pièces détachées. Tu as trois tâches, qui visent à afficher correctement les prix des vélos et des pièces sur le site web.

1. Exporte la fonction penceToPounds

Ton collègue a déjà écrit le squelette du module, les fonctions non définies penceToPounds et poundsToString. Cependant, il a oublié d'exporter la fonction penceToPounds, qui n'est donc actuellement pas visible par les autres modules ni par la suite de tests.

Ajoute penceToPounds à la liste des fonctions exportées.

2. Convertis les pence en livres

Actuellement, le prix est stocké sous forme d'un nombre entier de pence (la boutique est basée au Royaume-Uni). Sur le site web, on veut afficher le prix en livres, où 1,00 livre équivaut à 100 pence. Ta deuxième tâche est d'implémenter la fonction penceToPounds, qui prend un montant de pence de type Int et le convertit en son équivalent en livres sous forme de Float. Tu dois aussi définir l'annotation de type de cette fonction.

penceToPounds 106
    --> 1.06

3. Mets en forme le prix pour l'afficher sur le site web

Comme les vélos de Betty sont vendus en livres, les prix doivent être affichés avec le symbole « £ ». Ta troisième tâche consiste donc à implémenter la fonction poundsToString, qui prend un montant en livres de type Float et renvoie son prix affiché sous forme de String avec le symbole de la livre placé devant. Le module String contient la fonction String.fromFloat, qui te sera utile. Tu dois importer le module String avant de l'utiliser. Tu dois aussi définir l'annotation de type de poundsToString.

poundsToString 1.06
    --> "£1.06"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elm Exercism

Prêt à commencer Le magasin de vélos de Betty ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.