Slide 1

Slide 1 text

Programmation fonctionnelle / Haskell Cl´ ement Delafargue 15 octobre 2012

Slide 2

Slide 2 text

Section 1 Contexte

Slide 3

Slide 3 text

Une profusion de langages Il existe beaucoup de langages de programmation Des c´ el` ebres (C, Java) D’autres moins (J) Pourquoi cette profusion ?

Slide 4

Slide 4 text

Diff´ erents paradigmes Quelques paradigmes de programmation : Imp´ eratif Fonctionnel Logique

Slide 5

Slide 5 text

Le paradigme imp´ eratif Remonte ` a la machine de Turing Manutention d’espace m´ emoire Proche du fonctionnment des processeurs

Slide 6

Slide 6 text

Le paradigme fonctionnel Remonte au Lambda Calcul D´ efinition de fonctions et de leur combinaisons Proche des math´ ematiques

Slide 7

Slide 7 text

Le paradigme fonctionnel Pas d’instructions, mais des donn´ ees et leurs relations

Slide 8

Slide 8 text

Pourquoi le fonctionnel ? Raisonnement simplifi´ e D´ ebogage ais´ e Tests unitaires plus simples Concurrence Garanties fortes

Slide 9

Slide 9 text

Section 2 La programmation fonctionnelle

Slide 10

Slide 10 text

L’essence de la programmation fonctionnelle Des fonctions Leur composition

Slide 11

Slide 11 text

L’immutabilit´ e D´ efinition math´ ematique d’une variable Immutabilit´ e

Slide 12

Slide 12 text

La “transparence r´ ef´ erentielle” Une expression d´ enote toujours la meme chose, ind´ ependamment du contexte. Terme pas toujours employ´ e correctement. En r´ ealit´ e : “Absence d’effets de bord”

Slide 13

Slide 13 text

La r´ ecursion Fondamental Comment repr´ esenter une boucle sans la mutabilit´ e ? Approche math´ ematique x^0 = 1 x^n = x * x^(n-1) Insiste sur la d´ ecomposition du probl` eme

Slide 14

Slide 14 text

La programmation fonctionnelle typ´ ee Chaque valeur a un type (Entier, Bool´ een, Liste d’entiers, Fonction des entiers vers les Bool´ eens) Syst` emes de types souvent sophistiqu´ es

Slide 15

Slide 15 text

Correspondance de Curry Howard Correspondance preuve - programme. type <=> proposition programme bien typ´ e <=> preuve de la proposition Fondamental

Slide 16

Slide 16 text

Un langage fonctionnel Permet la manipulation de fonctions Encourage l’immutabilit´ e

Slide 17

Slide 17 text

Saines lectures Pour mieux comprendre pourquoi la FP est int´ eressante FP for the rest of us Why FP matters La r´ ef´ erence : Structure and Interpretation of Computer Programs

Slide 18

Slide 18 text

Section 3 Un langage fonctionnel, Haskell

Slide 19

Slide 19 text

Un langage fonctionnel, Haskell Haskell (nomm´ e en hommage ` a Haskell Curry) Premi` ere version en 1990 (un an avant python) “Design by committee” (entre autres : Simon Peyton Jones, John Hughes, Philip Wadler)

Slide 20

Slide 20 text

Les caract´ eristiques de Haskell Haskell est un langage : Fonctionnel Statiquement typ´ e “Fortement” typ´ e ` A inf´ erence de type Pur Paresseux Utilis´ e dans la vraie vie (un peu)

Slide 21

Slide 21 text

En d´ etail : Typage statique : typage d´ etermin´ e en amont Typage “fort” : ` a voir ` A inf´ erence de type : capable de d´ eterminer le type d’une variable Pur : pas d’effets de bord Paresseux : ne calcule un terme que quand (et si) il en a besoin

Slide 22

Slide 22 text

Les avantages Haskell est un langage : Fonctionnel : composablit´ e Statiquement typ´ e : sˆ uret´ e “Fortement” typ´ e : sˆ uret´ e ` A inf´ erence de type : concision Pur : composabilit´ e Paresseux : composabilit´ e

Slide 23

Slide 23 text

Pourquoi apprendre Haskell ? Pour le fun Pour voir ce qu’est un beau langage Pour les garanties qu’il apporte Pour la rapidit´ e de d´ eveloppement

Slide 24

Slide 24 text

Qui utilise Haskell ? Moi Cette pr´ esentation a ´ et´ e g´ en´ er´ ee par un programme en Haskell Elle est affich´ ee dans un syst` eme de fenˆ etrage en Haskell Des banques, en interne Facebook Des agences de d´ eveloppement

Slide 25

Slide 25 text

Quelques projets en Haskell pandoc: conversion de documents xmonad: gestionnaire de fenˆ etres Darcs: gestionnaire de versions Yesod: framework web

Slide 26

Slide 26 text

Quelques exemples La somme des n premiers nombres premiers primes = nubBy (\x y -> (gcd x y) > 1) [2..] sumOfPrimes n = sum $ take n primes La suite de Fibonacci fibs = fix ((0:) . scanl (+) 1) fibs’ = 0 : 1 : zipWith (+) fibs’ (tail fibs’)

Slide 27

Slide 27 text

La syntaxe Haskell Annotation de type (facultatif) a :: String f :: String -> String -> Boolean (+) :: (Num a) => a -> a -> a

Slide 28

Slide 28 text

La syntaxe Haskell D´ eclaration de fonction add2 a = a + 2 isTwo 2 = True isTwo _ = False headOr a [] = a headOr _ (x:_) = x

Slide 29

Slide 29 text

La syntaxe Haskell Application de fonction add2 4 isTwo (add2 0) 3 + 3 Application partielle (+3) (==0)

Slide 30

Slide 30 text

La syntaxe Haskell Composition de fonction isTwo (add2 0) isTwo . add2 0

Slide 31

Slide 31 text

La syntaxe Haskell D´ eclaration de variable let x = 0, y = 2 in x + y D´ eclaration de fonction interne foo x = bar (x + 2) where bar y = y + 5

Slide 32

Slide 32 text

La syntaxe Haskell List comprehension [ 2 * x | x <- [1..5]]

Slide 33

Slide 33 text

Exercice Calculer la somme d’une liste d’entiers. La version courte sum = fold (+) 0

Slide 34

Slide 34 text

Comment aboutir ` a la solution Pour un algorithme r´ ecursif Exprimer un cas d’arret Exprimer un pas de r´ eduction

Slide 35

Slide 35 text

Quelques petits exercices Calculer la somme des entiers naturels multiples de 3 ou 5 inf´ erieurs ` a 1000 Calculer l’inverse d’une liste Le Fizz Buzz

Slide 36

Slide 36 text

Saines lectures Learn You a Haskell Real World Haskell #haskell sur freenode