Programmation Fonctionnelle

Polytech Paris Saclay
2024-2025

Adrien Durier

OCaml

I. Expressions et Typage

I. Expressions et Typage

Typage Statique

OCaml

Types Simples

Typage Statique

Typage Statique

MAIS POURQUOI ?

  • Erreurs coûteuses :
    • NASA : Mars Climate Orbiter (1999) (conversion livre/kg)

 

  • Mais faciles à détecter!

 

  • Le typage revient à la mode!           (Rust, Typescript ...)

Types Simples

4 + 1 - 2 * 2 ;; 
(* - : int = 1 *)
5 / 2 ;; 
(* - : int = 2 *)
1_000_005 mod 2 ;; 
(* - : int = 1 *)
max_int + 1 ;; 
(* - : int = - 4611686018427387904 *)
  • int représente les entiers compris entre \( -2^{62} \) et  \( 2^{62} - 1\)
    • ​(sur une machine 64 bits)
  • opérations standards sur les entiers

INT

Types Simples

let x = 4.3e4 +. 1.2 *. -2.3
let y = 5. /. 2.
  • les types int et float sont disjoints
    • = ​50% de vos bugs : ' . ' manquant!

 

  • Opérations:   +.  -.  *.  /.  sqrt  cos  ...

 

  • On peut passer d'un entier à un flottant à l'aide de la fonction float_of_int et inversement truncate

FLOAT

Types Simples

let x = false || true
let x = 3 <= 1
let x = not (0=2) && 1 >= 3
let x = if 2 < 0 then 2.0 else (4.6 *. 1.2)
  • true, false, not (NON), && (ET), || (OU)...
  • <= est un peu comme une fonction qui prend 2 entiers et retourne un booléen !!
  • Dans une conditionnelle de la forme

 

 

 

BOOL

if exp1 then exp2 else exp3

l'expression exp1 doit être de type bool

let x = if 2 < 0 then 2.0 else (4.6 *. 1.2)
if exp1 then exp2 else exp3

exp1 doit être de type bool

let x = false || true
let x = 3 <= 1
let x = not (0=2) && 1 >= 3
let x = if 2 < 0 then 2.0 else (4.6 *. 1.2)

Types Simples

let x = false || true
let x = 3 <= 1
let x = not (0=2) && 1 >= 3
let x = if 2 < 0 then 2.0 else (4.6 *. 1.2)
  • true, false, not (NON), && (ET), || (OU)...
  • <= est un peu comme une fonction qui prend 2 entiers et retourne un booléen !!
  • Dans une conditionnelle de la forme

 

 

 

BOOL

if exp1 then exp2 else exp3

l'expression exp1 doit être de type bool

I. Expressions et Typage

Expressions

OCaml

Expressions

Les expressions sont les blocs de bases d'OCaml

 Deux Règles:

  1. Toute expression a un type
  2. Tout ce qui a un type est une expression
let x = 3 * 4

Donc, ceci n'est pas une expression !!!!

Expressions

Les expressions sont les blocs de bases d'OCaml

3 * 4

Par contre, ceci est une expression !!!!

 Deux Règles:

  1. Toute expression a un type
  2. Tout ce qui a un type est une expression

Expressions

Les expressions sont les blocs de bases d'OCaml

 Deux Règles:

  1. Toute expression (correcte) a un type
  2. Tout ce qui a un type est une expression         (ou une variable)
3 * x

Par contre, ceci est une expression !!!!

Expressions

x + 7
true
x > 8
if x then y else z

Les lignes suivantes sont également des expressions (et ont donc un type) !

bool

int

bool

?

  1. Toute expression correcte a un type

→ Si on connaît le type des variables !

Expressions

if 
	x 
    then 
    	y 
    else 
    	z

?

x: ?

z: ?

y: ?

Expressions

if 
	x 
    then 
    	y 
    else 
    	z

?

x: bool

z: ?

y: ?

=

=

Expressions

if 
	x 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    z

?

x: bool

z: ?

Expressions

if 
	x 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z

int

x: bool

z: int

b: bool

Expressions

(if 
	x 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z)
+ 7

int

x: bool

z: int

b: bool

Expressions

(if 
	(0 < 3) 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z)
+ 7

int

x: bool

z: int

Expressions

(if 
	(0 < 
    (if (not b) 
    	then z 
        else (z + 1)))
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z)
+ 7

int

x: bool

z: int

b: bool

(if 
	(0 < 
    (if (not z) 
    	then z 
        else (z + 1)))
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z)
+ 7
(if 
	(0 < 
    (if (not b) 
    	then z 
        else (z + 1))) 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z)
+ 7
let f b z =
(if 
	(0 < 
    (if (not b) 
    	then z 
        else (z + 1))) 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z) + 7
let f b z =
(if 
	(0 < 
    (if (not b) 
    	then z 
        else (z + 1))) 
    then 
    	(if b 
        	then (0 + 4)
    		else 1)
    else 
    	z) + 7
let x = f true 3

I. Expressions et Typage

Déclarations

OCaml

Déclarations

1. Un programme est une succession de déclarations let

let x = 3
let y = 4
let f x = x * y
let y = f 5

2. On ne peut pas utiliser une déclarations let dans une expression

let f x = let x = 4; 
	blablabla + x ...

Déclarations

3. Il n'y a pas de variables, que des constantes.

Donc, elles sont immuables!

let x = 3
let y = 4 * x
let x = 5

3. Il n'y a pas de variables, que des constantes.

Donc, elles sont immuables!

let x = 3
let y = 4 * x
let x = 5

Combien vaut y?

3. Il n'y a pas de variables, que des constantes.

Donc, elles sont immuables!

let x = 3
let y = 4 * x
let x = 5

y vaut bien 12 (une bonne fois pour toutes!)

Combien vaut y?

Déclarations

3. Il n'y a pas de variables, que des constantes.

Donc, elles sont immuables!

let x = 3
let y = 4 * x
let x = 5

y vaut bien 12 (une bonne fois pour toutes!)

4. Si je veux lancer une fonction mais que je me fiche du résultat, je peux écrire :

let _ = Printf.printf "AAAAAH MON PROF EST FOU"

Déclarations

5. Je peux déclarer des fonctions des deux façons suivante:

let f x = x * 3
let f = fun x -> x * 3

Et donc, en toute logique......

fun x -> x * 3

Est une expression !

Quel est son type?

int -> int

I. Expressions et Typage

Déclarations de fonctions

& Curryfication

OCaml

Curryfication

Quand je déclare une fonction à plusieurs arguments, je l'écris ainsi:

let f x y = x + y
(* ou *)
let f = fun x y -> x + y

Car cette fonction est de Type:

int -> int -> int
let f1 = fun x -> x + 1
let f2 = fun x y -> x *. y
let f3 = fun x y z -> x <= y + z
let id = fun x -> x

Quel est le type de ces fonctions?

f1: int -> int
f2: float -> float -> float
f3: int -> int -> int -> bool
id: 'a -> 'a
let f1 = fun x -> x + 1
let f2 = fun x y -> x *. y
let f3 = fun x y z -> x <= y + z
let id = fun x -> x
let f1 = fun x -> x + 1
let f2 = fun x y -> x *. y
let f3 = fun x y z -> x <= y + z
let id = fun x -> x
let f1 = fun x -> x + 1
let f2 = fun x y -> x *. y
let f3 = fun x y z -> x <= y + z
let id = fun x -> x

Programmation Fonctionnelle - I. Expressions et Typage (version web)

By Adrien Durier

Programmation Fonctionnelle - I. Expressions et Typage (version web)

Programmation Fonctionnelle: Cours 1 - Expressions et typage

  • 506