Durée
24h Th, 24h Pr, 20h Proj.
Nombre de crédits
Enseignant
Langue(s) de l'unité d'enseignement
Langue française
Organisation et évaluation
Enseignement au premier quadrimestre, examen en janvier
Horaire
Unités d'enseignement prérequises et corequises
Les unités prérequises ou corequises sont présentées au sein de chaque programme
Contenus de l'unité d'enseignement
Introduction générale à la programmation fonctionnelle. Les sujets incluent (par ordre alphabétique):
- Approches fonctionnelles des états, gestion des erreurs, ...
- Classes de types
- Foncteurs
- Fonctions d'ordre supérieur
- Monades
- Monoïdes
- Récursion vs itération
- Récursion structurelle
- Raisonnement équationnel
- Types de données algébriques : nombres, tuples, listes, ...
Le langage Scala est utilisé.
Le contenu de ce cours est divisé en huit chapitres organisés en cinq parties.
Partie 1 : Introduction à la programmation fonctionnelle
Chapitre 1 : Introduction
Ce chapitre présente les principes fondamentaux de la programmation fonctionnelle, notamment l'immuabilité, les fonctions pures et les fonctions d'ordre supérieur. Il aborde également les avantages de la programmation fonctionnelle, tels que la modularité, la testabilité et la concurrence améliorées. Un exemple assez complexe et fictif illustre les principes fondamentaux et les avantages.
Partie 2 : Principes et techniques fondamentaux
Chapitre 2 Partie 1 : Programmation d'ordre supérieur
Ce chapitre explore les possibilités offertes par les fonctions d'ordre supérieur, qui prennent d'autres fonctions comme arguments et/ou renvoient des fonctions comme résultats. Vous apprendrez à utiliser des fonctions d'ordre supérieur pour écrire du code Scala plus expressif, réutilisable et adaptable.
Chapitre 2 Partie 2 : Structures de données fonctionnelles
Ce chapitre explore les structures de données immuables appelées types de données algébriques (ADT) couramment utilisées dans la programmation fonctionnelle, telles que les listes, les arbres et les cartes. Vous comprendrez comment travailler avec ces structures et les avantages qu'elles offrent. Ce chapitre explore la correspondance de motifs pour traiter ces structures de données.
Chapitre 3 : Récursivité
Ce chapitre présente des concepts tels que la récursivité structurelle, la récursivité structurelle complète, la récursivité mixte, la récursivité non structurelle et le style de passage de continuation pour résoudre les problèmes et caractériser les solutions. Ce chapitre s'appuie sur les concepts vus au chapitre 2.
Chapitre 4 : Gestion des exceptions dans la programmation fonctionnelle
Dans ce chapitre, nous apprenons à gérer les erreurs de manière fonctionnelle à l'aide des ADT Option et Either, en évitant la gestion "traditionnelle" des exceptions qui repose sur des effets secondaires.
Chapitre 5 : Évaluation non stricte
Ce chapitre décrit la différence entre l'évaluation stricte et l'évaluation non-stricte (ou paresseuse), ainsi que comment utiliser efficacement la paresse dans vos programmes Scala. Vous découvrirez comment l'évaluation paresseuse, où les éléments ne sont calculés que lorsque cela est nécessaire, permet une programmation fonctionnelle efficace et élégante en Scala. Nous aborderons les appels par nom et par besoin et les utiliserons non seulement pour développer des programmes fonctionnels efficaces, mais aussi pour développer notre propre ADT LazyList, une structure de données utile pour représenter des séquences potentiellement infinies d'éléments.
Partie 3 : Un exercice de programmation fonctionnelle
Chapitre 6 : Un exercice de programmation fonctionnelle
Cette partie vise à développer les ADT nécessaires pour simuler des machines d'état de manière incrémentale. Ce chapitre s'appuie sur les cinq premiers chapitres et n'introduit que quelques nouveaux concepts de Scala (par exemple, les synonymes de type). L'exercice que nous abordons dans ce chapitre est similaire à la difficulté du projet, permettant aux étudiants d'évaluer la compréhension et la maîtrise requises dans les chapitres fondamentaux.
Partie 4 : Utiliser les mathématiques pour généraliser des solutions pour des types de problèmes
L'objectif de la partie 4 est de montrer que les concepts de la catégorie (une branche des mathématiques) ont des applications pratiques en informatique.
Chapitre 7 : Monoïdes et Foldable
Ce chapitre couvre les monoïdes, une structure algébrique fondamentale avec des applications d'agrégation et de parallélisation de données. Les monoïdes jouent également un rôle important dans les ADT Foldable, une abstraction importante pour travailler avec une large gamme de structures de données de manière générique et composable. Vous apprendrez à utiliser fold, foldLeft, foldRight, reduce, ... pour effectuer des opérations courantes telles que la somme d'éléments, la recherche du maximum ou la combinaison de valeurs tout en restant indépendant de la structure de données sous-jacente spécifique. Vous verrez que ces opérations sont basées sur des monoïdes.
Chapitre 8 : Foncteur et Monades
Ce chapitre s'appuie sur la théorie des catégories pour introduire deux nouvelles abstractions : Foncteur et Monade. Foncteur est une abstraction fondamentale de la programmation fonctionnelle qui vous permet d'appliquer des transformations à des valeurs encapsulées dans un contexte. Vous apprendrez comment Foncteur fournit une interface unifiée pour mapper des fonctions sur diverses structures de données, vous permettant d'écrire du code générique et réutilisable qui fonctionne de manière transparente sur différents types de conteneurs. Les monades fournissent un mécanisme de séquençage (ou d'enchaînement) de calculs impliquant des effets tels que l'état, la gestion des erreurs et les entrées/sorties tout en conservant une structure propre et composable.
Partie 5 : Programmation fonctionnelle en data engineering
L'objectif de cette partie est de vous montrer comment et où les principes que nous avons abordés en classe sont utilisés dans la recherche et l'industrie, ainsi que de vous donner un avant-goût de la manière dont ces principes sont réutilisés dans le master.
La cinquième partie n'est pas obligatoire pour ce cours. Vous serez invité à participer à une activité d'apprentissage non obligatoire dans laquelle vous serez initié à Apache Spark, un framework open source pour le traitement de données à grande échelle. En utilisant le paradigme de programmation fonctionnelle de Scala, vous apprendrez à utiliser les capacités de Spark pour effectuer des calculs distribués sur des ensembles de données massifs. Vous verrez comment les abstractions de base de Spark, telles que les ensembles de Resilient Distributed Datasets (RDD) et les DataFrames, s'intègrent de manière transparente aux concepts de programmation fonctionnelle, vous permettant d'écrire des pipelines de données expressifs, évolutifs et tolérants aux pannes.
Acquis d'apprentissage (objectifs d'apprentissage) de l'unité d'enseignement
Au terme de cette unité d'enseignement, vous seriez capable de:
- Comprendre le paradigme fonctionnel.
- Écrire des programmes dans le style fonctionnel.
- Utiliser le paradigme de programmation fonctionnelle pour résoudre divers problèmes.
- Spécifier, implémenter et utiliser des structures de données fonctionnelles et des algorithmes dans un style fonctionnel.
- Utiliser et comprendre les techniques de programmation fonctionnelle de type telles que le currying et la composition de fonctions.
- Analyser et raisonner sur les programmes fonctionnels.
- Apprécier les avantages de la programmation fonctionnelle.
- Déterminer quand l'approche fonctionnelle est plus pratique que l'approche impérative.
Savoirs et compétences prérequis
Cours MATH et INFO du bloc 1. Programmation orientée objet du bloc 2.
Activités d'apprentissage prévues et méthodes d'enseignement
Le cours organise quatre événements d'apprentissage clés, dont trois sont liés aux heures consacrées à la théorie, à la pratique et au projet.
Théorie : Pour la théorie, les connaissances seront transmises sur base d'un exposé soutenu par des diapositives. Vous avez également accès à des alternatives qui s'appuient sur le même principe de transmission : un livre de référence et des enregistrements vidéo des cours. Des petits débats ou discussions sont sporadiquement organisés pendant les exposés afin d'approfondir la compréhension de certains aspects. Ces débats peuvent également être utilisés pour introduire un nouveau sujet dans un chapitre.
Travaux Pratiques : Chaque séance commence par un exercice simple entièrement élaboré par l'équipe pédagogique. Nous attendons de vous que vous suiviez chacune de ces étapes et que vous nous posiez des questions si nécessaire. Puis, vous effectuerez des exercices d'entraînement. Ces exercices ont pour but de de vous former à l'utilisation des techniques vues au cours. Certaines séances d'exercices vous offrent un environnement dans lequel vous pouvez tester vos solutions. Les solutions à ces exercices sont mises à votre disposition après la séance.
Projet : Le projet consiste à concevoir et à développer un programme fonctionnel pour résoudre des problèmes bien connus (par exemple, des tableaux sémantiques, des algorithmes d'ordonnancement, etc.) qui sont importants en informatique. L'assistant et moi sommes là pour vous guider et vous accompagner. Contrairement aux exercices, où des solutions sont données, vous ne serez que guidé. Outre les cours et le projet, il existe des événements de méta-réflexion. Le but de la méta-réflexion est de comprendre où vous en êtes dans l'apprentissage du contenu du cours. Les projets sont réalisés en équipe de trois étudiants.
En dehors des cours et du projet, il y a des événements de métaréflexion. Le but de la métaréflexion est de comprendre où l'on en est dans l'apprentissage de la matière du cours.
- Le premier type d'activité est le feedback global sur les projets (erreurs courantes, observations, etc.). Le feedback global inclut également des statistiques concernant les notes et la session vous invite à poser des questions ou ouvrir le débat.
- Le deuxième type d'activité est l'interrogation d'entraînement. Des interrogations formatives auto-évaluées. Ces interrogations (non obligatoires) vous préparent à l'examen. Après cette interrogation, je partage des solutions types et nous discutons des erreurs que vous voulez partager. Vous êtes invité à discuter et à corriger les erreurs. Je vous explique comment les solutions sont évaluées et notées lors de l'examen.
Mode d'enseignement (présentiel, à distance, hybride)
Cours donné exclusivement en présentiel
Informations complémentaires:
Cours donné exclusivement en présentiel
Explications complémentaires:
Le cours est enseigné en français. Le livre et le matériel (y compris les diapositives) sont en anglais. Les interrogations et examens seront également disponibles en français. Les diapositives du cours contiendront des listes de traductions des concepts les plus importants.
Le matériel en anglais facilitera la tâche des étudiants internationaux pour étudier la matière de manière indépendante. Ces étudiants recevront également des interrogations et des examens en anglais.
Supports de cours, lectures obligatoires ou recommandées
Plate-forme(s) utilisée(s) pour les supports de cours :
- eCampus
- Microsoft Teams
Autre(s) site(s) utilisé(s) pour les supports de cours
- Scala Standard Library (https://www.scala-lang.org/api/current/)
Informations complémentaires:
Le syllabus (ou l'engagement pédagogique) est obligatoire. Des informations sur l'organisation du cours, le contenu du cours, les objectifs du cours et l'évaluation du cours peuvent être trouvées dans cette ressource.
Les diapositives sont une ressource obligatoire. Chaque chapitre est accompagné de diapositives détaillées et complètes. Il est possible d'étudier ce cours en utilisant uniquement les diapositives, mais vous êtes encouragé à combiner cela avec la présence en classe ou les enregistrements des cours. Les cours en face à face ou les enregistrements réexpliquent ou illustrent certains points sous des angles différents.
Pour le projet, la consultation de la Scala Standard Library est fortement recommandée.
Les supports d'exercices sont fortement recommandés. Les séances théoriques introduisent des exemples, et ces exemples correspondent aux (types d') exercices que nous aborderons lors des travaux pratiques. Cependant, les exercices peuvent introduire de nouveaux éléments. Il peut s'agir de nouveaux opérateurs, d'exemples plus élaborés ou difficiles, de détails techniques ou de cas particuliers. Les solutions seront disponibles après les exercices, mais vous êtes fortement encouragé à y assister et à les revoir en préparation de l'examen. Cet exercice vous prépare également à la réalisation de votre projet.
Les questions d'examen passées, les exemples de questions d'examen et les rubriques de projet sont fortement recommandés. Toutes ces ressources sont mises à disposition, en temps voulu, sur eCampus. Bien qu'elles soient abordées en classe, vous devrez les consulter pour avoir une idée concrète des attentes.
Le livre de référence est facultatif. "Michael Pilquist, Rúnar Bjarnason et Paul Chiusano, Functional Programming in Scala, 2e édition, Manning Publications." Ce livre peut être utile aux étudiants qui souhaitent apprendre la matière à leur propre rythme, en anglais, ou revisiter les chapitres différemment. Des exemplaires de ce livre sont disponibles à la bibliothèque.
Les enregistrements vidéo sont facultatifs. Les chapitres individuels sont divisés en parties logiques. Un enregistrement vidéo de chaque partie est disponible sur YouTube. Des liens vers des vidéos YouTube sont disponibles sur eCampus sous chaque chapitre. Ces vidéos sont une alternative aux cours en direct.
Les références supplémentaires partagées sur eCampus sont facultatives. Pour certains chapitres, il existe des liens vers des ressources et des articles. Ceux-ci sont destinés à fournir des conseils supplémentaires ou un contexte (historique) pour les personnes intéressées.
Modalités d'évaluation et critères
Examen(s) en session
Toutes sessions confondues
- En présentiel
évaluation écrite ( questions ouvertes )
Interrogation(s) hors session
Informations complémentaires:
Examen(s) en session
Toutes sessions confondues
- En présentiel
évaluation écrite ( questions ouvertes )
Travail à rendre - rapport
Interrogation(s) hors session
Explications complémentaires:
Deux interrogations, un projet, et un examen.
- Évaluation de la première interrogation (10%)
- Évaluation de la deuxième interrogation (10%)
- Évaluation du projet (30%)
- Examen écrit (50%)
- Les interrogations et l'examen écrit sont remplacés par un examen écrit comptant pour 70% de la note totale. Les étudiants dont la moyenne pondérée des interrogations et de l'examen est inférieure à 10/20 doivent repasser l'examen.
- Les étudiants qui n'ont pas obtenu au moins 10/20 pour leur projet peuvent soumettre à nouveau une version révisée de leur projet en août.
La note finale sera déterminée à partir d'une moyenne pondérée de toutes les évaluations. Cependant, les étudiants doivent obtenir une note minimale de 8/20 à chaque évaluation, sinon, la note d'évaluation la plus basse de l'étudiant sera utilisée comme note finale pour le cours. Au Q1, les interrogations et l'examen seront considérés ensemble en tant qu'une évaluation.
Stage(s)
Remarques organisationnelles et modifications principales apportées au cours
Tous les aspects organisationnels seront communiqués via eCampus.
Contacts
- Professeur: Christophe Debruyne