Programmation Fonctionnelle

Polytech Paris Saclay
2024-2025

Adrien Durier

OCaml

Introduction

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)

OCaml

OCaml

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)

Correct

+  Efficace

+  Elegant

OCaml

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1)
    	 + fibonacci (n - 2)

Impératif

VS

int fibonacci (int n) {
	int a = 0;
	int b = 1;
	int c;
	int i;
	if (n == 0) return 0;
	for (i = 2; i <= n; i++)
    {
		c = a + b;
		a = b;
		b = c;
	}
	return b;
}

Un peu de code!

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)

Un peu de code!

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)
  • let : déclarations (fonctions, constantes)
    • Top-level uniquement
  • rec : Indique que la fonction est récursive
  • fibonacci : Appel récursif 
    • fibonacci n utilise fibonacci (n - 1) et fibonacci (n - 2)
  • match : filtrage 

 

Comme en maths:

  • Soit x tel que ...
  • let x such that ...

Un peu de code!

let rec fibonacci n =
	if n = 0 then 0
    else if n = 1 then 1
    else fibonacci (n - 1) + fibonacci (n - 2)
    
  • let : déclarations (fonctions, constantes)
    • Top-level uniquement
  • rec : Indique que la fonction est récursive
  • fibonacci : Appel récursif 
    • fibonacci n utilise fibonacci (n - 1) et fibonacci (n - 2)
  • match : filtrage 
    • if ... then ... else : vous connaissez!

Un peu de code!

let rec fibonacci n =
	match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)
  • let : déclarations (fonctions, constantes)
    • Top-level uniquement
  • rec : Indique que la fonction est récursive
  • fibonacci : Appel récursif 
    • fibonacci n utilise fibonacci (n - 1) et fibonacci (n - 2)
  • match : filtrage 
    • ​Exploite le typage statique; concis, vérifiable

Introduction

Présentation du cours

OCaml

Présentation du cours

  • 2e année que je donne le cours
    • Mais je reprend tout à 0!
    • Tout est en construction!
  • Site du cours (soon ™) :

Présentation du cours

  • 2e année que je donne le cours
    • Mais je reprend tout à 0!
    • Tout est en construction!
  • Site du cours (soon ™) :
  • Serveur moodle (remplace ecampus, juste pour ce cours):
    • https://moodle.durier.xyz
    • Déjà en place, mais j'ai besoin de vous inscrire!!!
    • DM #1: m'envoyer un email avec votre nom - prénom
      • ​(puis accepter l'invitation, mettre un mot de passe, etc)
  • Serveur 'learn-ocaml' pour les TP (soon ™) :

Evaluation

  • Tout n'est pas (encore) fixé, on en discute

 

  • Contrôle continu
    • Je propose des mini-devoirs hebdomadaires
      • 15 minutes, pas plus!
    • + un vrai devoir à la maison
    • et/ou éventuellement un TP noté/partiel 

 

 

  • Un examen final qui compte pour 50/60%

Objectifs du cours

(dans un premier temps, au moins)

  • OCaml: Syntaxe et Typage
  • Fonctions récursives
  • Type avancés (algébriques)
    • Listes & fonctions récursives sur les listes
  • Paradigmes de base de la programmation fonctionnelle :
    • Fonctions d'ordre supérieur
    • Curryfication
  • Listes et fonctions récursives sur les listes
  • Arbres
  • Exceptions
  • Effets de bord et programmation impérative en OCaml

Introduction

Pourquoi OCaml?

OCaml

Pourquoi OCaml?

Pourquoi la programmation fonctionnelle?

  • Langages de haut niveau, très mathématiques
    • Très utilisés en vérification/logique
    • Abstraits
  • Code plus facile à vérifier
    • Pour les applications critiques
    • Fortement typé

Les paradigmes de la programmation fonctionnelle ont eu une influence importante sur de nombreux langages récents :

Les besoins croissants de programmes sûrs, validés ou vérifiés, ont mené à l'adoption croissante de : 

  • Typage statique
  • Garbage collection ou mémoire structurée
  • ...

Pourquoi la programmation fonctionnelle?

...

Pourquoi OCaml?

  • Presque aussi rapide que C
  • Orienté Objet (nous n'en ferons pas)
  • Compilé et interprété
  • Fortement Typé
  • Pas de gestion mémoire (garbage collection):

Du mauvais code (en C)

  • Pas d'allocation: la mémoire est libérée automatiquement
  • Réduit les risques de fuites
  • Impact (modeste) sur les performances

Pourquoi OCaml?

Robin Milner, Prix Turing

Un peu d'histoire ...

  • Origine : \(\lambda\)-calcul (Church, ~1930)

  • ML (1973, Robin Milner)

    • ​But : Preuve de programmes

Introduction

Utiliser OCaml

OCaml

Utiliser OCaml

Site Officiel: ocaml.org

Développé par l'INRIA

Utiliser OCaml

Site Officiel: ocaml.org

Développé par l'INRIA

  • Avant tout un langage compilé
    • ​(car très rapide une fois compilé!)
    • Pour l'installer:
$ apt install opam
$ opam init
$ eval $(opam env)
# Et voilà! :)

Utiliser OCaml

Site Officiel: ocaml.org

Développé par l'INRIA

  • Au début on utilisera plutôt des interpréteurs
    • ​Beaucoup moins rapide!
    • 0 efforts:
      • Grâce à js_of_ocaml, interpréteurs web
    • Egalement en CLI (OPAM):
      • ocaml, le défaut (sans coloration syntaxique
      • utop, mieux, avec coloration syntaxique 
        • installer avec opam install utop

Utiliser OCaml

Utiliser OCaml

 

 

  • Cela n'empêche pas d'utiliser l'instance publique! (pas les mêmes exercices!)

Utiliser OCaml

Compilation

  • Le top-level (interpréteur) autorise à exécuter 'par blocs' en séparant les blocs par des ' ;; '
  • ;; ne fait pas à proprement parler partie du langage, et ne doit pas être utilisé pour remplacer le ' ; ' de C !!!!!!!

 

 

 

 

Top-Level & Compilation

(* ;; interdit si compilé! *)
let x = 3;;
let f x = x + 4;;
f 5;;
- : int = 7

Ressources

Programmation Fonctionnelle - Introduction (Version Web)

By Adrien Durier

Programmation Fonctionnelle - Introduction (Version Web)

Programmation Fonctionnelle: Introduction

  • 421