Programmation Fonctionnelle Systèmes de types ML Practice ! Formation Programmation Fonctionnelle Yann Hamdaoui VIA IRIF (Paris Diderot) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types 1 Programmation Fonctionnelle Cékoi ? Le calcul Le λ-calcul 2 Systèmes de types Des braves types Les types simples 3 ML Un p'tit x ? Écolo-prog : recycler son code GNU's Not Unix C'est quoi ton type de terme ? 4 Practice ! Yago ML . . . . . . Practice ! . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Cékoi ? Ainsi fon,fon,ction Qu'est-ce que la programmation fonctionnelle ? Une classe de langages où les fonctions sont des "rst-class citizens" (higher order functions) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Cékoi ? Ainsi fon,fon,ction Qu'est-ce que la programmation fonctionnelle ? Une classe de langages où les fonctions sont des "rst-class citizens" (higher order functions) Un paradigme (style) de programmation Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Cékoi ? Ainsi fon,fon,ction Qu'est-ce que la programmation fonctionnelle ? Une classe de langages où les fonctions sont des "rst-class citizens" (higher order functions) Un paradigme (style) de programmation Une classe de langages basés sur le λ-calcul Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Cékoi ? Ainsi fon,fon,ction Qu'est-ce que la programmation fonctionnelle ? Une classe de langages où les fonctions sont des "rst-class citizens" (higher order functions) Un paradigme (style) de programmation Une classe de langages basés sur le λ-calcul Langages "fonctionnels" : C,C++, Python,Ruby,Javascript,PHP,. . . Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Cékoi ? Ainsi fon,fon,ction Qu'est-ce que la programmation fonctionnelle ? Une classe de langages où les fonctions sont des "rst-class citizens" (higher order functions) Un paradigme (style) de programmation Une classe de langages basés sur le λ-calcul Langages "fonctionnels" : C,C++, Python,Ruby,Javascript,PHP,. . . Langages fonctionnels : Lisp,(Standard)ML,OCaml,F#,Haskell,Scala,. . . Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Qu'est-ce que le calcul Comment dénir le calcul commerçant : arithmétique Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Qu'est-ce que le calcul Comment dénir le calcul commerçant : arithmétique informaticien : algorithme Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Qu'est-ce que le calcul Comment dénir le calcul commerçant : arithmétique informaticien : algorithme mathématicien : machines de Turing , fonctions récursives , . . . Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Qu'est-ce que le calcul Comment dénir le calcul commerçant : arithmétique informaticien : algorithme mathématicien : machines de Turing , fonctions récursives , . . . Calcul : grandeurs (données) + opérations (instructions) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Comment vas-tu, Ring ? ... c d e b b b . . . Ruban d'entrées/sorties état Modèle de calcul universel Modèle Turing-complet : simule une machine de Turing Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Turing-complétude Exemples classiques de systèmes Turing-complet . . . la plupart des langages de programmation les fonctions récursives jeux de la vie (automate cellulaire) . . . et moins classiques Magic : The Gathering Minecraft Conguration sendmail Pour un langage impératif : test(if) + boucle ou goto + read/write Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Von Neumann Langages impératifs : des instructions une mémoire Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le calcul Écrire, écrire, et écrire encore Une notion naturelle pour nous est la ré-écriture : (1 + (5*2) − 5) → (1 + (10) − 5) (1+(10) − 5) → (11 − 5) (11-5) → 6 mémoire + transitions vs expression + ré-écriture Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul L'avènement du λ Syntaxe V = {x, y , . . .} ensemble de variables M, N ::= x | λx.M | M N λ-calcul λx.5 Exemples λx.λy .(x + y ) λf .λx.(f x) Yago fonction x 7→ 5 x 7→ (y 7→ x + y ) (x, y ) 7→ x + y (f , x) 7→ f (x) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul Quid du calcul Le calcul est eectué par ré-écriture : c'est la β -réduction β -réduction (λx.M)N → M[N/x] Exemples (λx.5)M → 5 ((λx.λy .x + y ) 5) 6 → ?? Comment ré-écrire (U V ) W ? Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul β -réduction, version 2 β -réduction M → M′ (appl) M N → M′ N N → N′ (appr ) M N′ → M N′ M → M′ (lam) λx.M → λx.M ′ ((λx .λy .x + y ) 5) 6 λf .λx.(f x) (λy .y ) 0 Yago → → → → → (λy .5 + y ) 6 (5 + 6) λx .((λy .y ) x) 0 (λy .y ) 0 . . . . . . . . . . . . . . 0 . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul Stratégie Il peut y avoir plusieurs réductions, mais l'ordre n'importe pas ! C'est la conuence M M2 M1 Dans un langage, on choisit une N stratégie particulière Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul Expressivité Le λ-calcul est Turing-complet . . . Mais pour un encodage fastidieux ! Terme Encodage n Entier n λf .λx.f x = λf .λx.f (f (f . . . x)) . . .) Boucle Ω = (λx.x x) (λx.x x) ... ... On garde l'esprit mais on le rend utilisable Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul λ-calcul pratique Syntaxe M, N ::= x | λx.M | M N | n | M + N | (M, N) | proji M Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul λ-calcul pratique Et des règles de réduction Sémantique n+m proji (M1 , M2 ) → → n+m Mi M1 → M1′ (pairl) (M1 , M2 ) → (M1′ , M2 ) M1 → M1′ (plusl) M1 + M2 → M1′ + M2 Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Le λ-calcul λ-calcul pratique Exemples : (λx .(proj1 x) + 5) (1 + 2, y ) proj2 5 (λx.1 + x, y ) + 0 5 (λx.x) → → →∗ → → → (proj1 (1 + 2, y )) + 5 (1 + 2) + 5 8 ?? ?? ?? As-t-on un moyen d'empêcher ces situations a priori ? Oui : le typage ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Plan 1 2 3 4 Programmation Fonctionnelle Cékoi ? Le calcul Le λ-calcul Systèmes de types Des braves types Les types simples ML Un p'tit x ? Écolo-prog : recycler son code GNU's Not Unix C'est quoi ton type de terme ? Practice ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Des braves types Motivations Un système de types est un ensemble de contraintes supplémentaires sur la formation des programmes pour assurer statiquement certaines propriétés M + N : on veut que M →∗ m et N →∗ n proji M : on veut que M →∗ (M1 , M2 ) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Des braves types Motto Milner's slogan "Well-typed expressions do not go wrong" Robin Milner Ingrédients Des types : spécication Des règles de typage : preuve de la spécication Il a plusieurs rôles : Une documentation/spécication vériable automatiquement Garanties de sécurité Encourage l'abstraction et la programmation modulaire Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Des braves types Motto Milner's slogan "Well-typed expressions do not go wrong" Robin Milner Traduction du slogan de Milner (type safety, type soudness, . . . ) : Subject reduction : la réduction préserve le type Progress : on peut toujours réduire un terme qui n'est pas une valeur On commence par le typage simple Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Types τ, ν ::= int | τ → ν Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Règles - base Γ, x : τ ⊢ x : τ (var ) Γ, x : τ ⊢ M : τ ′ (lam) Γ ⊢ λx.M : τ → τ ′ Γ ⊢ M : τ → τ′ Γ ⊢ N : τ (app) Γ ⊢ M N : τ′ Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Règles - extensions Γ ⊢ n : int (int) Γ ⊢ M1 : int Γ ⊢ M2 : int (plus) Γ ⊢ M1 + M2 : int Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Types - produit τ, ν ::= int | τ → ν |τ ×ν Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Règles - produit Γ ⊢ M : τ1 Γ ⊢ N : τ2 (pair ) Γ ⊢ (M, N) : τ1 × τ2 Γ ⊢ M : τ1 × τ2 (proj) Γ ⊢ proji M : τi Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Types - somme τ, ν ::= int | τ → ν τ ×ν |τ +ν Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Règles - somme Γ ⊢ M : τ1 (inj) Γ ⊢ inj1 M : τ1 + τ2 Γ ⊢ M : τ1 + τ2 Γ ⊢ N1 : τ1 → τ Γ ⊢ N 2 : τ2 → τ (case) Γ ⊢ case M of N1 ||N2 : τ Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Exemples x : int ⊢ x : int (var) ⊢ λx.x : int → int x : int, y : int ⊢ x : int (var) (abs) x : int, y : int ⊢ y : int x : int, y : int ⊢ x + y : int (var) (plus) (abs) x : int ⊢ λy .x + y : int → int (abs) ⊢ λx.λy .x + y : int → int → int Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Les types simples λ-calcul simplement typé Les termes simplement typés terminent ! Trop de contraintes... Programmation générique : on doit typer λx.x diéremment pour chaque type d'argument Annoter tous les termes : c'est lourd ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Plan 1 2 3 4 Programmation Fonctionnelle Cékoi ? Le calcul Le λ-calcul Systèmes de types Des braves types Les types simples ML Un p'tit x ? Écolo-prog : recycler son code GNU's Not Unix C'est quoi ton type de terme ? Practice ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Un p'tit x ? Boucles en λ-calcul Comment coder la fonction factorielle ? factorielle ::= λn. if n = 1 then 1 else n ∗ factorielle (n − 1) Pour coder les boucles , ou les fonctions récursives : l'auto-application F ::= λf .λn. if n = 1 then 1 else n ∗ (f f (n − 1)) factorielle ::= F F . . . mais pas typable ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Un p'tit x ? Point xe On ajoute une construction syntaxique, une règle de type, une règle de réduction : Point xe M ::= . . . | µf .M µf .M → M[f /µf .M] Γ, f : τ ⊢ M : τ (fix) Γ ⊢ µf .M : τ Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Un p'tit x ? Exemple → →∗ →∗ µf .λn.( if n = 1 then 1 else n ∗ f (n − 1)) 2 λn .( if n = 1 then 1 else n ∗ (µf . . . .) (n − 1)) 2 2 ∗ ((µf . . . .) 1) 2∗1→1 Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Écolo-prog : recycler son code Polymorphisme Certains termes, comme λx.x , admettent plusieurs types : x : int ⊢ x : int (var) ⊢ λx.x : int → int Yago (abs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Écolo-prog : recycler son code Polymorphisme Certains termes, comme λx.x , admettent plusieurs types : x :α⊢x :α (var) ⊢ λx.x : α → α Yago (abs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Écolo-prog : recycler son code Types polymorphes Types - polymorphisme τ ::= τ |τ →τ |τ ×τ |τ +τ α | ∀α.τ Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Écolo-prog : recycler son code Polymorphisme Code générique Code type-safe Pas de pénalité (taille code, performances, etc.) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! GNU's Not Unix Type récursifs Certains types ont besoin de référer à eux même : Liste : vide ou un élément suivi d'une liste Arbre : une feuille ou un noeud et deux arbres λ-terme : cf dénition Types récursifs int_liste = Vide | Liste of int × int_liste int_arbre = Feuille of int | Noeud of int × int_arbre × int_arbre ∀α.liste α = Vide | Liste of α × (liste α) Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! GNU's Not Unix Le fardeau du typage Récapitulons : Types algébriques : créer de nouveaux types Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! GNU's Not Unix Le fardeau du typage Récapitulons : Types algébriques : créer de nouveaux types Types polymorphes : typer une seule fois les termes génériques Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! GNU's Not Unix Le fardeau du typage Récapitulons : Types algébriques : créer de nouveaux types Types polymorphes : typer une seule fois les termes génériques Types récursifs : créer des types "cycliques" Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! GNU's Not Unix Le fardeau du typage Récapitulons : Types algébriques : créer de nouveaux types Types polymorphes : typer une seule fois les termes génériques Types récursifs : créer des types "cycliques" Si l'on doit tout typer à la main, bon courage . . . Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! C'est quoi ton type de terme ? Les types c'est sympa mais L'inférence de type consiste à déduire un type et une dérivation à partir d'un terme non typé Si ce problème a une solution "plus générale", on dit que les programmes admettent un type principal Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! C'est quoi ton type de terme ? Quelques systèmes de types Types simples décidable mais pas de type principal ML décidable et type principal OCaml décidable mais plus de type principal SystemF indécidable et pas de type principal Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Plan 1 2 3 4 Programmation Fonctionnelle Cékoi ? Le calcul Le λ-calcul Systèmes de types Des braves types Les types simples ML Un p'tit x ? Écolo-prog : recycler son code GNU's Not Unix C'est quoi ton type de terme ? Practice ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . . Programmation Fonctionnelle Systèmes de types ML Practice ! Et maintenant . . . un peu de pratique ! Yago . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formation Programmation Fonctionnelle . . . . . . . . . .