EPAI ICT Module 323 (F119)
Résumé de section
-
Code d'honneur
En vous inscrivant à ce cours, vous vous engagez à respecter les règles suivantes :
Règle 1: Vous devez être l’auteur·rice des solutions que vous soumettez. Si vous copiez le travail d’une autre personne ou si vous vous en inspirez fortement en omettant de le mentionner, vous commettez un acte de plagiat. Par exemple, le fait d’utiliser une solution trouvée dans le web ou la solution d’un·e camarade de votre classe ou d’une année précédente constitue une violation de la présente règle. D’une manière générale, vous ne devez pas chercher à consulter une solution existante à un problème qui vous est posé dans le cadre de ce cours. Règle 2: Vous ne devez pas partager vos solutions avec vos camarades. Vous ne devez en aucun cas partager vos solutions avec vos camarades, que ce soit à leur demande expresse ou en les publiant d’une manière ou d’une autre. Règle 3: Vous devez mentionner toute aide que vous recevez. Si vous recevez de l’aide de la part d’une personne autre que votre enseignant·e pour la réalisation d’un travail, vous devez indiquer la nature de cette aide, et la manière dont elle a influencé votre solution. En outre, vous devez veiller à ce que l’aide reçue ne viole pas les règles 1 et 2. Règle 4: Vous devez être en mesure d’expliquer dans leur ensemble les solutions que vous soumettez. Quelle que soit l’aide que vous recevez pour effectuer un travail, vous devez pouvoir fournir des explications sur l’ensemble de la solution. De plus, dans le cas d’un travail de groupe et sauf indication contraire, vous devez être en mesure d’expliquer non seulement vos propres contributions, mais également celles de vos partenaires. Règle 5: Vous devez effectuer vos travaux de manière consciencieuse. Pour tous les travaux qui vous sont demandés, vous devez soumettre en temps et heure une solution réalisée avec minutie et application. Dans le cas où vous n’arriveriez pas au bout d’un travail, vous devez rendre la solution inachevée et un compte rendu détaillé des problèmes rencontrés. -
On peut se demander pourquoi utiliser le langage PureScript alors que nous utilisons par ailleurs Java. Dans ce contexte, un langage basé sur la JVM, comme Kotlin, Scala ou Clojure, serait sans doute un choix plus naturel.
Dans le cadre d'une pédagogie d'inspiration constructiviste et pragmatiste, il est important que le réel résiste. Lorsque l'on aborde la programmation fonctionnelle en 3e année, cette confrontation au réel ne peut pas se faire uniquement sur la base de la passation de tests. En effet, en plus de la fonctionnalité du programme, c'est aussi sa structure que l'on cherche à contraindre. Si la séquence d'instructions est implicite dans la syntaxe du langage (Kotlin, Scala), celle-ci ne contraint pas à penser le programme comme une seule expression.
En rendant la séquence explicite, Clojure impose cette contrainte. Toutefois, si Clojure rend les effets de bord visibles, il n'impose aucune contrainte sur leur utilisation et ne garantit donc pas la pureté des fonctions. Pour garantir cette pureté, il est nécessaire de se tourner vers un langage fonctionnel pur et, parmi les langages à usage général, Haskell est probablement le choix le plus évident.
Pourquoi ne pas avoir choisi Haskell ? L'idée était d'avoir un langage qui s'intègre facilement dans un environnement déjà connu (JVM, Node.js, navigateur). Le langage Frege (Haskell pour la JVM) ne semblant plus être activement maintenu, PureScript constitue un bon second choix.
-
Compétence
Effectuer une description déclarative et une implémentation fonctionnelle d’algorithmes et de parties d’applications.
Objectif 1
Analyser et décrire les exigences en vue de la réalisation d'une programmation fonctionnelle.[g4.1, g4.4]Connaissances requises
- Connaître la différence entre programmation impérative et programmation déclarative/fonctionnelle (paradigme de programmation déclarative).
- Connaître des méthodes de description déclarative de problèmes et d’états finaux.
- Connaître les avantages et les inconvénients de la programmation fonctionnelle.
- Connaître les termes de la programmation fonctionnelle (p. ex. fonction pure, donnée immuable, expression lambda, fonction, fermeture [closure], rappel [callback], foncteur), les comprendre et pouvoir les utiliser correctement.
- Connaître des possibilités pour élaborer un concept de réalisation adapté à la programmation fonctionnelle.
Objectif 2
Implémenter de manière efficiente des algorithmes et des problèmes d’applications selon le paradigme de programmation fonctionnelle et les exigences données. [g5.2, g5.5]Connaissances requises
- Pouvoir lire, comprendre, maintenir et étendre un code fonctionnel.
- Connaître des concepts de programmation fonctionnelle (p. ex. filter, map, reduce) et des patrons de conception adaptés (p. ex. builder pattern).
- Connaître des méthodes pour exécuter un code de manière distribuée, parallèle ou concurrente.
Objectif 3
Améliorer et optimiser le code impératif implémenté en utilisant la programmation fonctionnelle (refactorisation)Connaissances requises
- Connaître des moyens pour déterminer si des parties de programmes peuvent, après examen, être optimisées ou améliorées grâce à l’implémentation fonctionnelle.
- Connaître les éléments fonctionnels d’un langage de programmation et pouvoir ainsi développer des applications avec un paradigme de programmation impérative et déclarative.
Objectif 4
Vérifier l’exactitude et la qualité de l’implémentation.Connaissances requises
- Connaître des moyens de tester un code fonctionnel implémenté (p. ex. tests unitaires).
- Connaître des directives de code appropriées et les appliquer de manière systématique.
- Connaître les meilleures pratiques de la programmation fonctionnelle et pouvoir les appliquer.
-
Quand, où :
Lundi, 5 janvier 2026, 7:55-12:00, Salle F119
Lundi, 12 janvier 2026, 7:55-12:00, Salle F119Objectifs :
À la fin de cette séquence, vous devez :
- Connaître les notions de programme et de langage de programmation.
- Connaître la différence entre programme et algorithme.
- Connaître la notion d'architecture de von Neumann.
- Connaître la notion de programmation impérative.
- Connaître les notions de déclaration, de définition, d'expression et d'instruction.
- Connaître les notions de variable et de constante.
- Connaître les notions de méthode, de fonction et de procédure.
- Connaître les notions d'effet de bord (side effect) et de dépendance implicite.
- Connaître les inconvénients des effets de bord.
- Connaître les notions de fonction pure, de transparence référentielle et d'immutabilité.
- Connaître les avantages et les inconvénients de la transparence référentielle et de l'immutabilité.
- Connaître la notion de structure de données persistante.
- Connaître la notion d'opération d'entrée-sortie et les particularités de ces opérations (les effets de bord sont incontournables)
- Connaître les notions de programmation fonctionnelle et de langage fonctionnel.
- Connaître les notions de machine de Turing et de Turing-completeness.
- Connaître la notion de λ-calcul.
- Connaître la notion de paradigme de programmation.
-
Quand, où :
Lundi, 19 janvier 2026, 7:55-12:00, Salle F119
Objectifs :
À la fin de cette séquence vous devez :
- Connaître la notion d'expression conditionnelle (if-then-else)
- Connaître la différence entre une expression conditionnelle et une structure de choix.
- Connaître une manière de définir des variables locales dans un langage fonctionnel (expression let)
- Connaître la notion d'associativité à gauche dans l'application d'une fonction.
- Connaître la différence entre un littéral de nombre négatif (le moins fait partie du littéral) dans un langage comme Java et un opérateur de négation appliqué à un littéral de nombre positif dans les langages de la famille ML (Purescript, Haskell, etc.).
- Connaître la notion d'enregistrement (record).
- Connaître la notion de synonyme de type.
- Connaître le type Maybe a
-
Quand, où :
Lundi, 26 janvier 2026, 7:55-12:00, Salle F119
Lundi, 2 février 2026, 7:55-12:00, Salle F119Objectifs :
À la fin de cette séquence vous devez :
- Connaître la notion de pattern matching (expression case, définition de fonction)
- Connaître une autre manière de définir des variables locales dans un langage fonctionnel (clause where)
- Connaître la manière de réaliser une répétition en programmation fonctionnelle (appel récursif)
- Connaître le problème des appels récursifs (pile d'exécution).
- Connaître la notion de récursion terminale (tail recursion).
- Connaître la notion de « tail call elimination » ou « tail call optimization ».
-
Quand, où :
Lundi, 9 février 2026, 7:55-12:00, Salle F119
Objectifs :
À la fin de cette séquence vous devez :
- Connaître la notion de type algébrique.
- Connaître les notion de type produit (enregistrement) et type sum (union disjointe)
- Connaître la notion de classe de type (Eq, Show, etc.)
-
Quand, où :
Lundi, 23 février 2026, 7:55-12:00, Salle F119
Objectifs :
À la fin de cette séquence vous devez :
- Connaitre le type List et la notion de liste chaînée (linked list).
- Connaitre les constructeurs de liste
Conset: - Connaitre la notion de fonction d'ordre supérieur
- Connaitre la fonction map appliquée aux listes.
- Connaitre les fonctions foldl et foldr (reduce) appliquées aux listes.
- Connaitre la fonction filter appliquée aux listes.
- Connaitre des fonctions réalisables avec fold (length, find, any, all, etc.)
- Connaitre l'opérateur
#(reverse application) qui permet d'enchaîner des opérations comme avec l'opérateur|(pipe) en Bash.
-
Quand, où :
Lundi, 23 février 2026, 7:55-12:00, Salle F119
Objectifs :
À la fin de cette séquence vous devez :
- Connaitre la notion de foncteur (un type qui supporte la fonction map).
- Connaitre des exemples de foncteurs (List, Seq, Array, Maybe, Either, etc.).
- Connaitre les limites de map lorsque l'on enchaîne des opérations.
- Connaitre les fonction bind (ou >>=) et pure (ou return).
- Connaitre le fait que bind est souvent appelé flatMap dans d'autre langage (notamment Java et JavaScript)
- Connaitre la notion de monade (un foncteur qui supporte les méthodes bind et pure).
- Connaitre des exemples de monades (List, Seq, Array, Maybe, Either, etc.)
- Connaitre l'utilité du bloc do (sucre syntaxique) pour les bind.
- Connaitre la notion de monade d'effet (Effect / IO) et ce que cela représente.