Programmation fonctionnelle avec OCaml



Documents pareils
length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

modules & compilation

Algorithmique et Programmation, IMA

Cours 1 : La compilation

TP 1. Prise en main du langage Python

Classes et Objets en Ocaml.

Cours de Programmation 2

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Présentation du langage et premières fonctions

Machines virtuelles fonctionnelles (suite) Compilation ML Java

STAGE IREM 0- Premiers pas en Python

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C


1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmer en JAVA. par Tama

Recherche dans un tableau

Découverte de Python

Initiation à l algorithmique

Programmation. fonctionnelle, impérative, logique et orientée objet

Programmation en Caml pour Débutants

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Notions fondamentales du langage C# Version 1.0

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Plan du cours. Historique du langage Nouveautés de Java 7

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Vérification de programmes et de preuves Première partie. décrire des algorithmes

ACTIVITÉ DE PROGRAMMATION

Programmation Web. Madalina Croitoru IUT Montpellier

TP, première séquence d exercices.

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Algorithmes récursifs

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

INF 321 : mémento de la syntaxe de Java

Principes des langages de programmation INF 321. Eric Goubault

TP3 : Manipulation et implantation de systèmes de fichiers 1

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Bases de programmation. Cours 5. Structurer les données

Introduction au langage C

Projet de programmation (IK3) : TP n 1 Correction

Initiation à la programmation en Python

Cours d Algorithmique et de Langage C v 3.0

UE C avancé cours 1: introduction et révisions

Solutions du chapitre 4

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Corrigé des TD 1 à 5

Analyse de sécurité de logiciels système par typage statique

Claude Delannoy. 3 e édition C++

as Architecture des Systèmes d Information

Programmation en Java IUT GEII (MC-II1) 1

Lier Erlang avec d autres langages de programmation

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

UE Programmation Impérative Licence 2ème Année

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Évaluation et implémentation des langages

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Introduction à l algorithmique et à la programmation M1102 CM n 3

Utilisation d objets : String et ArrayList

Algorithmique et Programmation Fonctionnelle

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours d algorithmique pour la classe de 2nde

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Informatique Générale

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Conventions d écriture et outils de mise au point

Logiciel Libre Cours 2 Fondements: Programmation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Premiers Pas en Programmation Objet : les Classes et les Objets

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Cours Informatique Master STEP

Objets et Programmation. origine des langages orientés-objet

Licence Sciences et Technologies Examen janvier 2010

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Gestion mémoire et Représentation intermédiaire

INFORMATIQUE & WEB. PARCOURS CERTIFICAT PROFESSIONNEL Programmation de sites Web. 1 an 7 MODULES. Code du diplôme : CP09

ALGORITHMIQUE ET PROGRAMMATION En C

Java Licence Professionnelle CISII,

Chapitre VI- La validation de la composition.

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

L informatique en BCPST

Machines virtuelles Cours 1 : Introduction

Corrigé des exercices sur les références

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Transcription:

Programmation fonctionnelle avec OCaml 1ère séance, 19 février 2015 6 séances de 1h30 de cours et 3h de TP 3 projets avec soutenance D autres transparents sont disponibles avec vidéo (intranet) Samuel Hornus : samuel.hornus@inria.fr http ://www.loria.fr/ shornus/ocaml/

La boucle interactive On lance l interpréteur dans un terminal : $ ocaml ($ rlwrap ocaml) 1. On écrit une expression : # expression ;; 2. L interpréteur évalue l expression et imprime sa valeur : réponse

La boucle interactive On lance l interpréteur dans un terminal : $ ocaml ($ rlwrap ocaml) 1. On écrit une expression : # expression ;; 2. L interpréteur évalue l expression et imprime sa valeur : réponse read The REPL print eval Pour terminer la session : # #quit;; ou ^D

# 23;; - : int = 23 # f ;; - : char = f # -24;; - : int = -24 # 10.45;; - : float = 10.45 # (87, R );; - : int * char = (87, R ) # "fa sol la";; - : string = "fa sol la" Quelques expressions simples

# 23;; - : int = 23 # f ;; - : char = f # -24;; - : int = -24 # 10.45;; - : float = 10.45 # (87, R );; - : int * char = (87, R ) # "fa sol la";; - : string = "fa sol la" Quelques expressions simples Chaque expression possède un type une valeur

# 23+10;; Quelques expressions un peu moins simples - : int = 33 # [ f ; a ; 4 ];; - : char list = [ f ; a ; 4 ] # 24 / 13;; - : int = 1 # 10.45 *. 10.0;; - : float = 104.5 # cos;; - : float -> float = <fun> # cos 3.14159;; - : float = -0.999999999996479261 # String.length "fa sol la";; - : int = 9

# 23+10;; Quelques expressions un peu moins simples - : int = 33 # [ f ; a ; 4 ];; - : char list = [ f ; a ; 4 ] # 24 / 13;; - : int = 1 # 10.45 *. 10.0;; - : float = 104.5 # cos;; - : float -> float = <fun> # cos 3.14159;; - : float = -0.999999999996479261 # String.length "fa sol la";; - : int = 9 Une liste de caractères

# 23+10;; Quelques expressions un peu moins simples - : int = 33 # [ f ; a ; 4 ];; - : char list = [ f ; a ; 4 ] # 24 / 13;; - : int = 1 # 10.45 *. 10.0;; - : float = 104.5 # cos;; - : float -> float = <fun> # cos 3.14159;; - : float = -0.999999999996479261 # String.length "fa sol la";; - : int = 9 Une liste de caractères Observer le nom de l opérateur : *.

# 23+10;; Quelques expressions un peu moins simples - : int = 33 # [ f ; a ; 4 ];; - : char list = [ f ; a ; 4 ] # 24 / 13;; - : int = 1 # 10.45 *. 10.0;; - : float = 104.5 # cos;; - : float -> float = <fun> # cos 3.14159;; - : float = -0.999999999996479261 # String.length "fa sol la";; - : int = 9 Une liste de caractères Observer le nom de l opérateur : *. Application d une fonction à un argument.

# let a = 42;; val a : int = 42 # let b = a - 20;; val b : int = 22 Liaison d une valeur à un nom # b+a;; - : int = 64

Liaison d une valeur à un nom # let a = 42;; val a : int = 42 # let b = a - 20;; val b : int = 22 Syntaxe : let nom = expression ;; # b+a;; - : int = 64 liaison

# let a = 42;; val a : int = 42 # let b = a - 20;; val b : int = 22 Liaison d une valeur à un nom # b+a;; - : int = 64 valeur type nom

# let a = 42;; val a : int = 42 # let b = a - 20;; val b : int = 22 Liaison d une valeur à un nom # b+a;; - : int = 64 valeur type nom La liaison d un nom à une valeur est enregistrée dans un environnement. Plusieurs environnements existent souvent en même temps.

Liaison d une valeur à un nom (suite) # let b = false;; val b : bool = false # c;; Error: Unbound value c # let l = [67;-4;100];; val l : int list = [67; -4; 100] # let first = List.hd l;; val first : int = 67

L expression conditionnelle if condition then expression1 else expression2

L expression conditionnelle if condition then expression1 else expression2 de type bool Opérateurs booléens : not,, &&

L expression conditionnelle if condition then expression1 else expression2 de type bool de même type Opérateurs booléens : not,, &&

L expression conditionnelle if condition then expression1 else expression2 de type bool de même type Le résultat de l expression conditionnelle if... a le même type que les expressions expression1 et expression2 Opérateurs booléens : not,, &&

L expression conditionnelle if condition then expression1 else expression2 de type bool de même type # if 22 >= 21 then "gagné!" else "perdu!";; - : string = "gagné!" Opérateurs booléens : not,, &&

L expression conditionnelle if condition then expression1 else expression2 de type bool de même type # if 0 < 1 then 42 else 42.0;; Error: This expression has type float but an expression was expected of type int Opérateurs booléens : not,, &&

Filtrage par motifs pattern matching On doit souvent calculer une valeur en fonction d une autre : # let x = if c = 0 then "zéro" else if c = 1 then "un" else if c = 2 then "deux" else... if c = 7 then "sept" else if c = 8 then "huit" else if c = 9 then "neuf" else failwith "Problème!";; val x : string =...

Filtrage par motifs pattern matching Une écriture plus concise et plus puissante : # let x = match c with 0 -> "zéro" 1 -> "un" 2 -> "deux"... 7 -> "sept" 8 -> "huit" 9 -> "neuf" -> failwith "Problème!";; val x : string =...

Syntaxe du filtrage par motifs match expr with la valeur à filtrer motif 1 -> expression 1 motif 2 -> expression 2 motif 3 -> expression 3... le filtrage : une suite de filtres

Syntaxe du filtrage par motifs match expr with la valeur à filtrer motif 1 -> expression 1 motif 2 -> expression 2 motif 3 -> expression 3... le filtrage : une suite de filtres Un motif est la description d un ensemble de valeur(s). On peut le voir comme un moule dans lequel un valeur rentre ou ne rentre pas

Syntaxe du filtrage par motifs match expr with la valeur à filtrer motif 1 -> expression 1 motif 2 -> expression 2 motif 3 -> expression 3... le filtrage : une suite de filtres Un motif est la description d un ensemble de valeur(s). On peut le voir comme un moule dans lequel un valeur rentre ou ne rentre pas Si la valeur de expr correspond au motif i alors le filtrage match.. prend pour valeur celle de l expression i

Syntaxe du filtrage par motifs match expr with la valeur à filtrer motif 1 -> expression 1 motif 2 -> expression 2 motif 3 -> expression 3... le filtrage : une suite de filtres Un motif est la description d un ensemble de valeur(s). On peut le voir comme un moule dans lequel un valeur rentre ou ne rentre pas Si la valeur de expr correspond au motif i alors le filtrage match.. prend pour valeur celle de l expression i Intuitivement, le filtrage parcours les motifs de haut en bas et s arrête au premier motif qui correspond à la valeur filtrée.

Syntaxe du filtrage par motifs Exemple : # let aire p = match p with ("carré", c) -> c *. c ("disque", r) -> 3.1419 *. r *. r ("équi", r) -> (sqrt 3.0) /. 2.0 *. r *. r (s, ) -> failwith ("Qu est-ce qu un "^s^"?");; val aire : string * float -> float = <fun>

Syntaxe du filtrage par motifs Exemple : # let aire p = match p with ("carré", c) -> c *. c ("disque", r) -> 3.1419 *. r *. r ("équi", r) -> (sqrt 3.0) /. 2.0 *. r *. r (s, ) -> failwith ("Qu est-ce qu un "^s^"?");; val aire : string * float -> float = <fun> # aire ("équi", 2.0);; - : float = 3.46410161513775439 # aire ("carré", 2.0);; - : float = 4. # aire ("rond", 1.0);; Exception: Failure "Qu est-ce qu un rond?".

Fonctions Syntaxe : function paramètre -> expression # function x -> x+1;; - : int -> int = <fun> Application de la fonction à l argument 27 : # (function x -> x+1) 27;; - : int = 28 Nommer la fonction dans l environnement courant : # let mafonc = function x -> x+1;; val mafonc : int -> int = <fun> # mafonc 31;; - : int = 32

Fonctions Fonction à 2 paramètres? # let ajoute = function x -> function y -> x +. y;; val ajoute : float -> float -> float = <fun> Application de la fonction : # ajoute 6.6 3.4;; - : float = 10. Une syntaxe plus courte : # let ajoute = fun x y -> x +. y;; val ajoute : float -> float -> float = <fun>

Fonctions Encore plus court : # let ajoute x y = x +. y;; val ajoute : float -> float -> float = <fun> Idem pour plus de paramètres : # let calcul a b c d = a*a+b - ( c/d );; val calcul : int -> int -> int -> int -> int = <fun>

Fonctions Encore plus court : # let ajoute x y = x +. y;; val ajoute : float -> float -> float = <fun> Idem pour plus de paramètres : # let calcul a b c d = a*a+b - ( c/d );; val calcul : int -> int -> int -> int -> int = <fun> À retenir : function x -> function y -> exp est identique à fun x y -> exp let mafonction = fun x y -> exp est identique à let mafonction x y = exp

Exemple de fonction récursive : la factorielle Rappel : n! = n (n 1) (n 2)... 2 1.

Exemple de fonction récursive : la factorielle Rappel : n! = n (n 1) (n 2)... 2 1. # let facto n = if n <= 1 then 1 else n * facto (n-1);; Error: Unbound value facto

Exemple de fonction récursive : la factorielle Rappel : n! = n (n 1) (n 2)... 2 1. # let facto n = if n <= 1 then 1 else n * facto (n-1);; Error: Unbound value facto # let rec facto n = if n = 1 then 1 else n * facto (n-1);; val facto : int -> int = <fun>

Exemple de fonction récursive : la factorielle Rappel : n! = n (n 1) (n 2)... 2 1. # let facto n = if n <= 1 then 1 else n * facto (n-1);; Error: Unbound value facto # let rec facto n = if n = 1 then 1 else n * facto (n-1);; val facto : int -> int = <fun> # facto 12;; - : int = 479001600 # List.map facto [0;1;2;3;4;5;6;7;8;9];; - : int list = [1; 1; 2; 6; 24; 120; 720; 5040; 40320; 362880]

Exemple de fonction récursive : la factorielle Rappel : n! = n (n 1) (n 2)... 2 1. # let facto n = if n <= 1 then 1 else n * facto (n-1);; Error: Unbound value facto # let rec facto n = if n = 1 then 1 else n * facto (n-1);; val facto : int -> int = <fun> # facto 12;; - : int = 479001600 # List.map facto [0;1;2;3;4;5;6;7;8;9];; - : int list = [1; 1; 2; 6; 24; 120; 720; 5040; 40320; 362880]

Une fonction est une valeur, comme un entier ou une liste. # let ajouteur x = (function s -> s + x);; val ajouteur : int -> int -> int = <fun> # let t = ajouteur 3;; val t : int -> int = <fun> # t 10;; - : int = 13 # let compose f g = (function x -> f (g x));; val compose : ( a -> b) -> ( c -> a) -> c -> b = <fun> # let mystere = compose t (ajouteur 2);; val mystere : int -> int = <fun>

Une fonction est une valeur, comme un entier ou une liste. # let ajouteur x = (function s -> s + x);; val ajouteur : int -> int -> int = <fun> # let t = ajouteur 3;; val t : int -> int = <fun> # t 10;; - : int = 13 # let compose f g = (function x -> f (g x));; val compose : ( a -> b) -> ( c -> a) -> c -> b = <fun> # let mystere = compose t (ajouteur 2);; val mystere : int -> int = <fun> # mystere 20;; - : int = 25

Application partielle d une fonction # let ajouteur x = function s -> s + x;; val ajouteur : int -> int -> int = <fun> # let ajouteur x s = s + x;; val ajouteur : int -> int -> int = <fun>

Application partielle d une fonction # let ajouteur x = function s -> s + x;; val ajouteur : int -> int -> int = <fun> # let ajouteur x s = s + x;; val ajouteur : int -> int -> int = <fun> # ajouteur 3;; - : int -> int = <fun> # ajouteur 3;; - : int -> int = <fun>

Application partielle d une fonction # let ajouteur x = function s -> s + x;; val ajouteur : int -> int -> int = <fun> # let ajouteur x s = s + x;; val ajouteur : int -> int -> int = <fun> # ajouteur 3;; - : int -> int = <fun> # ajouteur 3;; - : int -> int = <fun> # ajouteur 3 4;; - : int = 7 # ajouteur 3 4;; - : int = 7

# let a = "bonjour";; val a : string = "bonjour" Sous-expression

# let a = "bonjour";; val a : string = "bonjour" # let a = 10 in a + 20;; - : int = 30 Sous-expression

# let a = "bonjour";; val a : string = "bonjour" # let a = 10 in a + 20;; - : int = 30 # a;; val a : string = "bonjour" Sous-expression

# let a = "bonjour";; val a : string = "bonjour" # let a = 10 in a + 20;; - : int = 30 # a;; val a : string = "bonjour" Sous-expression L expression let α in crée un sous-environnement dans lequel : est enregistré la liaison α, est évaluée l expression qui suit.

# let a = "bonjour";; val a : string = "bonjour" # let a = 10 in a + 20;; - : int = 30 # a;; val a : string = "bonjour" Syntaxe : let nom 1 = expr 1 in let nom 2 = expr 2 in let nom 3 = expr 3 in expr finale Sous-expression L expression let α in crée un sous-environnement dans lequel : est enregistré la liaison α, est évaluée l expression qui suit.

# let a = "bonjour";; val a : string = "bonjour" # let a = 10 in a + 20;; - : int = 30 # a;; val a : string = "bonjour" Sous-expression L expression let α in crée un sous-environnement dans lequel : est enregistré la liaison α, est évaluée l expression qui suit. Syntaxe : let nom 1 = expr 1 in let nom 2 = expr 2 in let nom 3 = expr 3 in expr finale Avec des liaisons simultanées : let nom 1 = expr 1 and nom 2 = expr 2 and nom 3 = expr 3 in expr finale

Exemple courant d utilisation d une sous-expression # let rec compte acc n = if n = 0 then acc else compte (acc+1) (n-1);; val compte : int -> int = <fun> # compte 0 40 000 000;; - : int = 40000000

Exemple courant d utilisation d une sous-expression # let rec compte acc n = if n = 0 then acc else compte (acc+1) (n-1);; val compte : int -> int = <fun> # compte 0 40 000 000;; - : int = 40000000 il est dommage (et dangereux) de devoir ajouter un argument qui doit toujours valoir 0

Exemple courant d utilisation d une sous-expression # let rec compte acc n = if n = 0 then acc else compte (acc+1) (n-1);; val compte : int -> int = <fun> # compte 0 40 000 000;; - : int = 40000000 il est dommage (et dangereux) de devoir ajouter un argument qui doit toujours valoir 0 Solution : créer une fonction auxiliaire locale : # let compte n = let rec aux acc p = if p = 0 then acc else aux (acc+1) (p-1) in aux 0 n;; compte : int -> int = <fun>

La suite de Fibonacci ( si on a le temps ) La suite de Fibonacci est définie comme suit : F (0) = 0 F (1) = 1 F (n) = F (n 1) + F (n 2)

L algorithme de Luhn ( si on a le temps ) Pour vérifier qu un numéro est valide. un numéro (SIREN) 5 3 0 3 6 8 1 5 8 multiplier par 1 2 1 2 1 2 1 2 1 résultat 5 6 0 6 6 16 1 10 8 réduire 5 6 0 6 6 7 1 1 8 somme S=40 La somme S modulo 10 d un numéro SIREN doit valoir 0. Si S mod 10 <> 0 alors il y a une erreur dans le numéro.

# 10+20;; - : int = 30 Inférence de type : la base # (+);; - : int -> int -> int = <fun> # 10.2 +. 20.3;; - : float = 30.5 # 10 + 20.3;; Error: This expression has type float but an expression was expected of type int # 10 +. 20;; Error: This expression has type int but an expression was expected of type float

Inférence de type : la base Solution : conversion explicite : # float 10;; - : float = 10. # int of float 23.4;; - : int = 23 # string of int 45;; - : string = "45" int of string, float of string, string of float, etc.

et le ;;, qu est-ce que c est? ; ;

et le ;;, qu est-ce que c est? ; ; Il sert uniquement à la boucle interactive ocaml pour savoir quand commencer à interpréter ce que l utilisateur écrit. read The REPL print ;; eval

et le ;;, qu est-ce que c est? ; ; Il sert uniquement à la boucle interactive ocaml pour savoir quand commencer à interpréter ce que l utilisateur écrit. En interne, il est remplacé par in : Quand on utilise la boucle interactive, on n arrête pas d imbriquer des expressions les unes dans les autres. read The REPL print ;; eval

La boucle interactive d Ocaml : $ ocaml print endline string ; ; #quit ; ; ˆD Types de base : Récapitulatif int 23-139 float 4.2-5.58e-2 bool true false char a 4 \n string bonjour le\tmonde retour chariot\n list [45 ;26 ;-4 ;348] tuple (1,2) ( a, 18) ( Robert, 37, 1.82) unit ()

La boucle interactive d Ocaml : $ ocaml print endline string ; ; #quit ; ; ˆD Récapitulatif Types de base : int 23-139 Encodage source : ISO Latin 1 float 4.2-5.58e-2 bool true false char a 4 \n string bonjour le\tmonde retour chariot\n list [45 ;26 ;-4 ;348] tuple (1,2) ( a, 18) ( Robert, 37, 1.82) unit ()

La boucle interactive d Ocaml : Récapitulatif $ ocaml print endline string ; ; #quit ; ; ˆD en français : n-uplet Types de base : int 23-139 Encodage source : ISO Latin 1 float 4.2-5.58e-2 bool true false char a 4 \n string bonjour le\tmonde retour chariot\n list [45 ;26 ;-4 ;348] tuple (1,2) ( a, 18) ( Robert, 37, 1.82) unit ()

Ocaml en bref typage statique et inférence automatique de type programmation fonctionnelle, modulaire, objet, impérative système d exceptions gestion automatique de la mémoire (ramasse miettes)

Ocaml en bref typage statique et inférence automatique de type programmation fonctionnelle, modulaire, objet, impérative système d exceptions gestion automatique de la mémoire (ramasse miettes) Outils interpréteur interactif : ocaml en script : #!/usr/bin/env ocaml compilateur vers machine virtuelle : ocamlc machine virtuelle : ocamlrun compilateur vers code machine : ocamlopt ocamldebug, ocamlprof etc.

Programmation fonctionnelle La programmation fonctionnelle est un style de programmation une manière de programmer mettant en avant la notion de fonction et d immutabilité.

Programmation fonctionnelle La programmation fonctionnelle est un style de programmation une manière de programmer mettant en avant la notion de fonction et d immutabilité. 1. Une fonction est vue comme une fonction mathématique : même argument même résultat

Programmation fonctionnelle La programmation fonctionnelle est un style de programmation une manière de programmer mettant en avant la notion de fonction et d immutabilité. 1. Une fonction est vue comme une fonction mathématique : même argument même résultat 2. Les fonctions sont des valeurs que l on peut manipuler tout comme d autres type de base (entier,réel, caractère, chaîne de caractère,...) on peut passer un fonction en paramètre d une fonction une fonction peut retourner une fonction

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement)

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client Industrie financière : LexiFi, Jane Street (trading)

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client Industrie financière : LexiFi, Jane Street (trading) The ASTRÉE Static Analyzer So far, ASTRÉE has proved the absence of runtime errors in the primary control software of the Airbus A340 family

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client Industrie financière : LexiFi, Jane Street (trading) The ASTRÉE Static Analyzer So far, ASTRÉE has proved the absence of runtime errors in the primary control software of the Airbus A340 family FFTW génère du code C optimisé pour les calculs de transformées de Fourier.

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client Industrie financière : LexiFi, Jane Street (trading) The ASTRÉE Static Analyzer So far, ASTRÉE has proved the absence of runtime errors in the primary control software of the Airbus A340 family FFTW génère du code C optimisé pour les calculs de transformées de Fourier. Vérification automatique de driver chez Microsoft

OCaml en pratique The Unison File Synchronizer (changement Java OCaml au milieu du développement) The MLdonkey peer-to-peer client Industrie financière : LexiFi, Jane Street (trading) The ASTRÉE Static Analyzer So far, ASTRÉE has proved the absence of runtime errors in the primary control software of the Airbus A340 family FFTW génère du code C optimisé pour les calculs de transformées de Fourier. Vérification automatique de driver chez Microsoft Facebook utilise OCaml (entre autres)

Programmation fonctionnelle en pratique Erlang conçu par Ericsson pour système de télécommunication robuste fonction chat de Facebook (avec ejabberd) Twitterfall, analyse les tendances sur Twitter Wings 3D, un modeleur 3D

Programmation fonctionnelle en pratique Erlang conçu par Ericsson pour système de télécommunication robuste fonction chat de Facebook (avec ejabberd) Twitterfall, analyse les tendances sur Twitter Wings 3D, un modeleur 3D Haskell utilisé par plusieurs banques pour leurs logiciels internes Facebook : manipulation automatique de code PHP

Programmation fonctionnelle en pratique Erlang conçu par Ericsson pour système de télécommunication robuste fonction chat de Facebook (avec ejabberd) Twitterfall, analyse les tendances sur Twitter Wings 3D, un modeleur 3D Haskell utilisé par plusieurs banques pour leurs logiciels internes Facebook : manipulation automatique de code PHP Autres langages fonctionnels : Scala, {Standard ML, F#}, {Lisp, Scheme, Clojure}

Fin Fin du cours d aujourd hui. Le prochain cours sera plus léger et portera sur les types et la création de nouveaux types. http ://ocaml.org/

Garde dans un motif On peut affiner un motif par l ajout de conditions appelées gardes : # let signe n = match n with 0 -> "nul" x when x < 0 -> "négatif" -> "positif";; val signe : int -> string = <fun>

Garde dans un motif On peut affiner un motif par l ajout de conditions appelées gardes : # let signe n = match n with 0 -> "nul" x when x < 0 -> "négatif" -> "positif";; val signe : int -> string = <fun> est identique à : # let signe n = if n = 0 then "nul" else if n > 0 then "positif" else "négatif";; val signe : int -> string = <fun>

Garde dans un motif On peut affiner un motif par l ajout de conditions appelées gardes : # let signe n = match n with 0 -> "nul" x when x < 0 -> "négatif" -> "positif";; val signe : int -> string = <fun> est identique à : ça s appelle une garde # let signe n = if n = 0 then "nul" else if n > 0 then "positif" else "négatif";; val signe : int -> string = <fun>

Liaisons simultanées # let pair k = if k = 0 then true else impair (k-1);; # let impair k = if k = 0 then false else pair (k-1);; Error: Unbound value impair

Liaisons simultanées # let pair k = if k = 0 then true else impair (k-1);; # let impair k = if k = 0 then false else pair (k-1);; Error: Unbound value impair Solution : liaison simultanée avec le mot clé and # let rec pair k = if k = 0 then true else impair (k-1) and impair k = if k = 0 then false else pair (k-1);; val pair : int -> bool = <fun> val impair : int -> bool = <fun> # impair 22;; - : bool = false

Récursivité terminale # let rec compte n = if n <= 0 then 0 else 1 + compte (n-1);; val compte : int -> int = <fun> # compte 23;; - : int = 23 # compte 1000;; - : int = 1000 # compte 300 000;; Stack overflow during evaluation (looping recursion?).

Récursivité terminale # let rec compte aux acc n = if n = 0 then acc else compte aux (acc+1) (n-1);; val compte aux : int -> int = <fun> # let rec compte n = compte aux 0 n;; val compte : int -> int = <fun> # compte 0 300 000;; - : int = 300000 # compte 0 40 000 000;; - : int = 40000000