INFAL233 - Programmation fonctionnelle

Haskell

Objectifs

  • Comprendre les bases de la programmation fonctionnelle

  • Appréhender un langage fonctionnel "pur"

  • Écrire une ou plusieurs applications mettant à profit les mécanismes de programmation fonctionnelle

Déroulement théorique 😅

Unresolved directive in index.adoc - include::partial$planning.adoc[]

Programmation fonctionnelle ?

  • Paradigme de programmation (!= objet, impératif, etc…​)

  • Les fonctions sont au cœur des langages

  • Programme = application et composition de fonctions

  • Immutabilité

  • Fonctions déterministes

  • Application à la programmation du lambda-calcul

Lambda calcul

Lambda calcul ?

  • Méthode de calcul et de raisonnement

  • Inventé dans les années 1930 par Alonzo Church

  • Contemporain de la machine de Turing (Church était son directeur de thèse)

  • L’un peut servir à modéliser l’autre

Fonctions 1/3

  • Fonction = relation entre un ensemble d’entrées possibles et un ensemble de sorties possibles

  • La fonction est appliquée à ses entrées pour déduire les sorties

  • Exemple : fonction \$f\$
    \$f(1) = A\$
    \$f(2) = B\$
    \$f(3) = C\$

  • L’ensemble d’entrée est \$\{1,2,3\}\$, l’ensemble de sortie est \$\{A,B,C\}\$

Fonctions 2/3

La fonction suivante n’est pas valide :

\$f(1) = X\$
\$f(1) = Y\$
\$f(3) = Z\$

Une même valeur d’entrée devrait toujours renvoyer la même valeur de sortie.

Fonctions 3/3

La fonction suivante est-elle valide ?

\$f(1) = A\$
\$f(2) = A\$
\$f(3) = A\$

Lamba : Introduction

Le lambda calcul a 3 principaux composants :

expression

peut être une variable, une abstraction, ou une combinaison des deux

variable

n’a pas de valeur ou de sens en particulier, sert d’entrées potentielle à une fonction

abstraction

une fonction, possède une tête et un corps : \$λx.x\$

Lambda : structure

λ x . x
^─┬─^
  └───── tête de la lambda.
λ x . x
  ^───── paramètre unique de la fonction,
          se lie à toute variable du même nom
          dans le corps de la lambda
λ x . x
      ^── corps, l'expression que retourne
           la lambda quand on l'applique

La lambda n’a pas de nom, on l’appelle une abstraction car c’est une généralisation d’un problème à résoudre.

Équivalence alpha

Le nom de la variable dans la lambda \$λx.x\$ n’a aucune importance sémantique, on considère que ces lambdas sont la même fonction :

\$λx.x\$
\$λd.d\$
\$λz.z\$

Réduction beta 1

On peut appliquer une lambda à un argument :

\$(λx.x)\ 2\$

On substitue alors la variable \$x\$ par la valeur passée en argument pour donner le résultat \$2\$. La lambda implémente la fonction identité.

  • Exemple avec une fonction mathématique : \$(λx.x + 1)\$. Qu’arrive-t-il si on applique l’abstraction à 2 ? à 10 ?

Réduction beta 2

  • On peut appliquer une abstraction à une autre abstraction : \$(λx.x)(λy.y)\$

Plusieurs arguments

Langage Haskell

Hello Haskell

Types

Récursivité

Entrées/Sorties

Interactions avec l’utilisateur