// BLOG

Elm #7 - Expressions

La partie 7 se concentre sur la synthaxe des expressions dans Elm. If, Case of, Let in ... après la lecture de ce chapitre, les expressions Elm n'auront plus de secrets pour vous ! Petite chose déroutante, les boucles de type foreach n'existent pas vraiement avec Elm.

Rédigé le 14.10.2018
Par Gilles Vauvarin

Elm Programmation fonctionnelle

Expression If ... then ... else ...

Cette expression nécessite la présence des trois parties suivantes :

Une condition : If …

Une expression (branch) a évaluer si la condition est vraie : then …

Une expression (branch) a évaluer si la condition est fausse : else …

Les deux expressions (then et else) doivent être traitées et de même type.

A noter que comme toute expression dans Elm, l’expression If renvoie une valeur.

age = 23

whatYouAre = if age > 18 then "Adult" else "Child or teenager"

> "Adult"

On peut biensure ajouter des conditions à tester avec else if :

if n < 0 then
 "n is negative"
else if n > 0 then
 "n is positive"
else
 "n is zero"

Expression Case ... of ...

Case fonctionne en faisant correspondre une expression à un motif. Lorsqu’une correspondance est trouvée, il évalue l’expression à droite de la flèche -> et retourne la valeur produite.

Ca sera plus claire avec un exemple :

dayInNumber = 5

weekday dayInNumber =
 case dayInNumber of
 0 ->
 "Sunday"

 1 ->
 "Monday"

 2 ->
 "Tuesday"

 3 ->
 "Wednesday"

 4 ->
 "Thursday"

 5 ->
 "Friday"

 6 ->
 "Saturday"

 _ ->
 "Unknown day"


> "Friday"

Ici on regarde à quel motif correspond la valeur de dayInNumber (“5”) et on retourne la valeur de l’expression correspondante (“Friday”).

Le “_” permet de renvoyer une valeur par défaut si aucune correspondance n’est trouvée.

Expression Let ... in ...

Let permet de définir des valeurs intermédiaires pour simplifier l’écriture d’expression complexes ou tout simplement pour donner provisoirement un nom plus explicite à une valeur.

let
 x = 3 * 8
 y = 4 ^ 2
in
 x + y


let
 twentyFour =
 3 * 8
 sixteen =
 4 ^ 2
in
 twentyFour + sixteen

La porté de let est locale c’est à dire que les constantes définient dans let ne sont utilisables que dans in.

On utilise fréquemment let ... in ... dans des fonctions, les constantes définient dans let sont alors visibles que dans la fonction et non dans le reste du programme. C’est un peu l’équivalent des variables privées dans les langages objet.

maFonction param1 param 2 =
 let 
 var : Int
 var = param1 * param2 * ...
 in
 ... var ...

Le code doit être indenté comme dans l’exemple ci-dessus et le code écrit dans in doit retourner une valeur.

Vous pouvez ajouter la signature des types dans un let ... in ... si vous le souhaitez.

Où est passé mon foreach ?

Il n’y a pas dans Elm d’expressions pour itérer sur une collection comme on le fait avec foreach ou for ... in ... dans les autres langages.

On doit donc utiliser des fonctions qui prennent une fonction en paramètre et transforment une liste en une autre.

C’est ce que propose par exemple la fonction List.map :

-- Application d'une fonction sur tous les éléments d'une liste
map : (a -> b) -> List a -> List b

-- Ex 1 :
double a = 
 a * 2

List.map double [1,4,9] == [2,8,18]


-- Ex 2 :
List.map not [True,False,True] == [False,True,False]

La librairie List est incluse dans le core de Elm mais il convient de faire précéder la fonction par le nom de la librairie car il existe d’autres fonctions map dans d’autres librairies.

Exemple de l’utilisation de la fonction List.map pour afficher une liste ul/li à partir des éléments d’une liste :

-- Liste de villes
villes = ["Berlin",Paris","Londres"]

-- Fonction affichant une ligne de  contenant un String
villeGenerateurListe ville =
 li [] [ text ville ]

main =
 div [] [
 ul [] (List.map villeGenerateurListe villes)
 ]

Remarque: List.map renvoyant une liste il n’est pas nécessaire de rajouter les crochets en 2 eme paramètre de ul, ce paramètre étant lui même une liste.

Sources:

https://elmprogramming.com
https://elm-lang.org/
http://ludovic.coullet.net/elm-/-ep1--un-premier-programme-avec-elm/

Disclaimer:
Etant un total débutant dans le langage Elm et la programmation fonctionnel, il se peut que des incompréhensions ou des erreurs se soient glissées dans mes explications. Si vous en remarquez, merci de me les signaler pour que je puisse les corriger au plus vite.