Approches Fonctionnelles de la Programmation

publicité
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Approches Fonctionnelles de la
Programmation
Typage
Conditionnels
Lisp / Haskell: Tutoriel des Différences
Nombres
Listes
Sqrt
Didier Verna
[email protected]
http://www.lrde.epita.fr/˜didier
1/44
Table des matières
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
1
Éléments de Syntaxe
2
Notion d’Expression
3
Typage et Vérification
4
Expressions conditionnelles
5
Arithmétique
6
Listes et Séquences
7
Petit exemple : calcul de racines carrées
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
2/44
Syntaxe
Ou « abscence de . . . »
Programmation
Fonctionnelle
Didier Verna
E PITA
Mise en forme :
I
Syntaxe
Expressions
I
Typage
Conditionnels
Nombres
Nommage :
I
Listes
Sqrt
4/44
Haskell : Indentation (« offside-rule », Peter J. Landin).
Séparateur implicite : ’;’.
Quelques mots réservés.
Lisp : Parenthèses (mais Cf. reader-macros).
Aucun mot réservé.
I
Haskell : Indentique au C, plus apostrophe.
Première lettre capitalisée pour les types.
Lisp : N’importe quoi.
Syntaxe spéciale pour les symboles ésothériques :
|...|
Opérateurs et fonctions
Notation infixe et préfixe
Programmation
Fonctionnelle
Didier Verna
E PITA
Lisp : Pas de distinction
(sauf opérateurs spéciaux)
I
Syntaxe
I
Expressions
I
Typage
Conditionnels
Nombres
Listes
Sqrt
Haskell : Distinction
(mais ponts entre les deux notations)
I
I
I
I
5/44
Notation exclusivement préfixe (ou pas : Cf. macros)
Opérateurs variadiques
Imbrication naturelle
3 + 4 ⇔ (+) 3 4
div 3 4 ⇔ 3 ‘div‘ 4
Problèmes d’associativité et de précédence
(f n+1, f -12 etc.)
Définition d’opérateurs par notation préfixe
! # $ % & * + > / < = > ? \ ^ | : - ~
Rappel : 3 types d’Expressions
3 aspects langagiers
Programmation
Fonctionnelle
Primitives
Didier Verna
E PITA
Syntaxe
Procédures / Données
Expressions
Typage
Combinaisons
Abstractions
Conditionnels
Nombres
Listes
Sqrt
7/44
Expressions littérales :
s’évaluent à elles-mêmes
Expressions combinées :
application de procédures (opérateurs, fonctions) à des
arguments (expressions)
Expressions abstraites :
nommage / assignation d’expressions (simples,
combinées, fonctionnelles)
Expressions Abstraites
Nommage et assignation
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Typage
Conditionnels
Nommage : (fonctionnel pur)
Donner un nom à une valeur
Une valeur peut donc avoir différents noms.
Assignation : (fonctionnel impur)
Donner une valeur à un nom
Un nom peut donc avoir différentes valeurs.
Nombres
Listes
Sqrt
Haskell
Lisp
foo , bar , boo : : F l o a t
f o o = 10
bar = s q r t ( 3 ∗ ( 6 + 7 ) − 8 )
boo = bar
( defparameter ∗f o o∗ 10)
( s e t f ∗f o o∗ ( s q r t (− (∗ 3 (+ 6 7 ) ) 8 ) ) )
baz : : F l o a t −> F l o a t −> F l o a t
baz a b = s q r t ( 3 ∗ ( a + 7 ) − b )
( defun baz ( a b )
( s q r t (− (∗ 3 (+ a 7 ) ) b ) ) ) )
( defconstant bar ∗f o o ∗)
Haskell : nommage syntaxique (déclarations)
Lisp : nommage fonctionnel (expressions)
8/44
La boucle « read-eval-print »
Développement interactif
Programmation
Fonctionnelle
Didier Verna
E PITA
Boucle d’évaluation (R EPL) :
I
I
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
9/44
I
Read : saisir une expression
Eval : calculer (« évaluer ») sa valeur
Print : présenter le résultat sous forme affichable
Remarques :
I
I
Haskell : R EPL limitée (expressions vs. déclarations)
Lisp : limite floue entre interprétation et compilation
Lisp : Typage Dynamique
Et le typage devient « fort »
Programmation
Fonctionnelle
Didier Verna
E PITA
Variables non typées :
variable = pointeur vers un objet Lisp
Expressions
Valeurs typées :
information contenue dans chaque objet
Typage
Information de typage accessible : (fonctionnelle)
Syntaxe
Conditionnels
Nombres
( type−of t h i s )
( typep t h a t ’ i n t e g e r )
Listes
Sqrt
Attention au vocabulaire :
I
I
I
11/44
Typage implicite (au moins dans le code)
Vérification de type dynamique (à l’exécution)
Typage fort
Toute erreur de type est détectée (mais à l’exécution)
Lisp : Typage Dynamique. . . ou pas !
Et le typage devient « faible »
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
La légende de la lenteur :
Typage dynamique ⇒ vérification au vol ⇒ lenteur
Sauf que :
I
Typage
I
Conditionnels
Structures de données « modernes »
(tableaux, tables de hash etc.)
Déclarations explicites de type
Nombres
( declare ( t y p e fixnum f o o b a r ) )
Listes
Sqrt
I
Niveaux d’optimisation des compilateurs
( declare ( o p t i m i z e ( speed 3 ) ( s a f e t y 0 ) ( debug 0 ) ) )
Remarque : déclaration 6= expression ;-)
12/44
Haskell : Typage statique
Le typage reste « fort »
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Variables typées :
Rappel : variable = constante
=⇒ Type constant
Information de typage accessible :
Mais construction non langagière (Hugs :type)
Attention au vocabulaire :
I
Listes
Sqrt
I
I
13/44
Typage explicite ou implicite
Inférence / Polymorphisme
Vérification de type statique (à la compilation)
Typage fort
Toute erreur de type est détectée (à la compilation)
Haskell : Typage statique et polymorphisme
Travailler sur plusieurs types
Programmation
Fonctionnelle
Didier Verna
E PITA
length : : [ a ] −> I n t
length [ ] = 0
length ( x : xs ) = 1 + length xs
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
Quel est le type de length ?
I
I
I
[Int] -> Int
[String] -> Int
...
Typage polymorphe :
I
I
Variable de type : length :: [a] -> Int
:type retourne le type le plus général.
Polymorphisme vs. Surcharge :
I
I
14/44
Polymorphisme : définition unique ∀ type
Surcharge : (overloading) définitions 6= selon le type
Typage Lispien vs. Haskellien
Mérites comparés
Programmation
Fonctionnelle
Lisp :
Didier Verna
E PITA
I
I
Syntaxe
Expressions
I
Typage
I
Conditionnels
Nombres
Listes
Typage très libéral
Polymorphisme de-facto ou explicite
(introspection, OOP, macros etc.)
Compromis efficacité / sûreté
Mais : Cf. Qi / Racket (typage statique)
Haskell :
I
I
Sqrt
I
Typage très contrai(gna)nt
Polymorphisme « rigide »
(variables de type, types algébriques etc.)
Sûreté de-facto sans compromis
Le vrai défi du 21e siècle :
I
15/44
Languages statiques et dynamiques
Booléens
Vrai ou faux ?
Programmation
Fonctionnelle
Didier Verna
E PITA
Haskell :
I
I
Syntaxe
I
Expressions
I
Typage
Conditionnels
Nombres
Listes
Sqrt
17/44
Type Bool
Valeurs True et False
Opérateurs : &&, ||, not
Fonctions : and, or :: [Bool] -> Bool
Lisp :
I
I
I
Pas de type
Valeurs t et tout sauf nil, et nil / ()
Opérateurs spéciaux : (variadiques) and, or, not
Expressions conditionnelles
P’têt ben qu’oui, p’têt ben qu’non. . .
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Typage
if then else :
Haskell
Lisp
max3 : : I n t −> I n t −> I n t −> I n t
max3 m n p = i f (m >= n ) && (m >= p ) then m
else i f ( n >= m) && ( n >= p )
then n else p
( defun max3 (m n p )
( i f ( and ( >= m n ) ( >= m p ) )
m
( i f ( and ( >= n m) ( >= n p ) )
n
p)))
Conditionnels
Nombres
Guardes et cond :
Listes
Sqrt
18/44
Haskell
Lisp
max3 : : I n t −> I n t −> I n t −> I n t
max3 m n p
| (m >= n ) && (m >= p ) = m
| ( n >= m) && ( n >= p ) = n
| otherwise = p
( defun max3 (m n p )
( cond ( ( and ( >= m n ) ( >= m p ) )
m)
( ( and ( >= n m) ( >= n p ) )
n)
( t p)))
Haskell : Conditionnels vs. Équations
Quand on peut pattern matcher. . .
Programmation
Fonctionnelle
Didier Verna
E PITA
ssq : : I n t −> I n t
ssq n = i f ( n == 1 ) then 1
else n∗n + ssq ( n−1)
Syntaxe
Expressions
Typage
Conditionnels
ssq : : I n t −> I n t
ssq n
| ( n == 1 ) = 1
| otherwise = n∗n + ssq ( n−1)
Mise en équations
préférable
ssq : : I n t −> I n t
ssq 1 = 1
ssq n = n∗n + ssq ( n−1)
Nombres
Listes
Conditionnel par pattern matching :
Sqrt
l a s t : : [ a ] −> a
l a s t x = case ( reverse x ) of
[ ] −> e r r o r "Empty list"
( r : r s ) −> r
19/44
Lisp : Autres conditionnels
More than one way to do it. . .
Programmation
Fonctionnelle
Sur des objets :
Sur des types :
( defun month−length ( month )
( case month
( ( j a n mar may j u l aug o c t dec ) 31)
( ( apr j u n s e p t nov ) 30)
( f e b 28) ; ; Y2K bug ! ! !
( otherwise "Unknown month !" ) ) )
( defun + f u n c ( x )
( typecase x
( number # ’ + )
( l i s t # ’ append )
( t #’ list )))
Didier Verna
E PITA
Syntaxe
Expressions
Typage
( defun my+ (& r e s t args )
( apply (+ f u n c ( c a r args ) ) args ) )
Conditionnels
Nombres
Listes
Sqrt
Autres :
when, unless etc.
20/44
Lisp : Types numériques
Un deux trois nous irons au bois. . .
Programmation
Fonctionnelle
ratio
24/84
−34/36
Didier Verna
E PITA
rational
...
Syntaxe
integer
real
Expressions
345
... −28
...
t
Typage
Conditionnels
atom
number
float
254.3
... −84.863e3
complex
#c(real img)
Nombres
Listes
Sqrt
Fonctions floatp, integerp etc.
Transtypage implicite :
ratios vers entiers, complexes vers réels
Transtypage opérationnel :
I
I
22/44
automatique : vers flottants ou complexes
explicite : float, coerce
Haskell : Types numériques
Quatre cinq six cueillir des cerises
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
23/44
Même notation qu’en Lisp (ou autre)
Hiérarchie similaire (Int, Float etc.)
Surcharge des littéraux
(2 est à la fois un Int et un Float)
Surcharge des opérateurs
(==) :: Int -> Int -> Bool
(==) :: Float -> Float -> Bool
Pas de transtypage opérationnel automatique
fromIntegral :: <integral> -> <number>
Opérations
Sept huit neuf dans mon panier neuf
Programmation
Fonctionnelle
Didier Verna
E PITA
Extraction :
I
truncate, floor, ceiling, round
Arithmétique :
Syntaxe
I
Expressions
Typage
Conditionnels
Nombres
Listes
+ - *, div (Haskell), mod, abs, signum
Relationnel :
I
< > <= >= /=, == (Haskell), = eql (Lisp)
Exponentiation :
I
Sqrt
exp, log, logBase (Haskell), expt (Lisp), ^ **
(Haskell), sqrt
Trigonometrie :
I
24/44
pi sin cos tan acos. . .
Listes
Type natif dans tous les langages fonctionnels
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe :
I
I
Syntaxe
Expressions
Type :
I
Typage
Conditionnels
Nombres
Listes
Sqrt
I
Haskell : Listes homogènes.
∀ t, ∃ [t] (liste d’éléments de type t).
Lisp : Listes hétérogènes. Prédicat listp.
Liste vide :
I
I
26/44
Haskell : [e1, e2, e3, ...]
Lisp : (e1 e2 e3 ...)
Haskell : []. Appartient à tous les types de liste.
Lisp : (), nil (Cf. latin nihil).
Constructeurs de listes
Au commencement, il y avait cons. . .
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Représentation :
I
I
Expressions
Typage
Conditionnels
Nombres
Listes
Toute liste peut être décrite comme un élément de tête
(head) et le reste / la queue de la liste (tail).
En théorie, les listes sont représentées par
constructions successives au dessus de la liste vide.
Construction :
I
I
I
Sqrt
Haskell : opérateur (:) :: a -> [a] -> [a]
Lisp : fonction cons, prédicat consp
« Constructeur » ⇒ unicité de la construction
Cf. ++, append etc.
Génération :
I
I
Lisp seul : Fonction list (Aucun sens en Haskell)
Autres :
•
•
27/44
Lisp : (make-list n &key initial-element)
Haskell : replicate :: Int -> a -> [a]
Représentation emboîtée
Lisp : « cons » = paire de pointeurs
Programmation
Fonctionnelle
Didier Verna
E PITA
()
[]
(1) (cons 1 nil)
[1] 1:[]
(1 2) (cons 1 (cons 2 nil))
[1, 2] 1:(2:[])
1 nil
1
2 nil
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Listes
(nil) (cons nil nil)
[[]] []:[]
nil nil
((1) (2)) (cons (cons 1 nil) (cons (cons 2 nil) nil))
[[1], [2]] (1:[]):((2:[]):[])
Sqrt
nil
b
nil
b
nil
(1 (2) 3) (cons 1 (cons (cons 2 nil) (cons 3 nil)))
1
3
2
28/44
nil
nil
Haskell : Remarques sur le constructeur
En vrac
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Associativité : à droite.
[3,4] = 3:[4] = 3:(4:[]) = 3:4:[]
Précédence : l’application lie toujours plus fort.
⇒ toujours parenthéser !
Typage
Conditionnels
Nombres
t a i l : : [ a ] −> [ a ]
tail [] = []
t a i l ( x : xs ) = xs
Listes
Sqrt
Pattern matching : répétition de variable interdite.
e l t : : a −> [ a ] −> Bool
elt x []
= False
e l t x ( x : xs ) = True
−− B a r f ! !
e l t x ( y : ys ) = elem x ys
29/44
Accesseurs de listes
Éléments, ou cons
Programmation
Fonctionnelle
Lisp :
Didier Verna
E PITA
I
Syntaxe
Expressions
I
Typage
I
Conditionnels
Nombres
Listes
Sqrt
30/44
car, cdr, c[ad]+r (jusqu’à 4) en termes de cons
(Cf. IBM-704 : Contents of Adress/Decrement
Register)
last, (nthcdr n lst) en termes de cons
first . . . tenth, (nth n lst) en termes d’éléments
Haskell :
I
I
I
Pattern matching : (x:xs)
head, tail en termes de cons
(!!) :: [a] -> Int -> a,
last (6= Lisp) en termes d’éléments
Haskell : Énumérateurs
Passe-moi l’sucre. . .
Programmation
Fonctionnelle
2 formes d’énumération :
Didier Verna
E PITA
Syntaxe
−− [ n . . m]
−− [ n , p . . m]
Expressions
[2 . . 7]
[3.1 . . 7.0]
[7 ,6 . . 3]
[0.0 ,0.3 . . 1.0]
Typage
Conditionnels
Nombres
Listes
Sqrt
31/44
Remarque : sucre syntaxique
Haskell : « Compréhensions » de listes
Générateurs par extraction, test et transformation
Programmation
Fonctionnelle
[f (n)|n ∈ lst, C1 (n), C2 (n), . . .]
Didier Verna
E PITA
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Littéralement : la liste des f (n) telle que n ∈ lst et
∀i, Ci (n) est vraie.
Générateur : n <- lst en Haskell.
Exemples :
Listes
Sqrt
[ 2∗n
| n <− [ 2 , 3 , 4 ] ]
[ n == 3 | n <− [ 2 , 3 , 4 ] ]
[ 2∗n
| n <− [ 2 , 3 , 4 ] , n == 3 ]
Pattern matching : dans le générateur
[ m∗n
32/44
| [m, n ] <− [ [ 2 , 3 ] , [ 4 , 5 ] , [ 6 , 7 ] ] , m > 2 ]
Remarques sur les compréhensions
En vrac. . .
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Utilisation comme filtre :
import Char
d i g i t s : : S t r i n g −> S t r i n g
d i g i t s s t r = [ c | c <− s t r , i s D i g i t c ]
Typage
Conditionnels
Utilisation en corps de fonction :
Nombres
Listes
Sqrt
isEven : : I n t −> Bool
isEven n = ( n ‘mod‘ 2 == 0 )
a l l E v e n : : [ I n t ] −> Bool
a l l E v e n xs = ( xs == [ e | e <− xs , isEven e ] )
a l l O d d : : [ I n t ] −> Bool
a l l O d d xs = ( [ ] == [ e | e <− xs , isEven e ] )
33/44
Remarques sur les compréhensions (suite)
Suite du vrac. . .
Programmation
Fonctionnelle
Attention : variables locales aux compréhensions
Didier Verna
E PITA
Syntaxe
bogusFind : : I n t −> [ [ I n t ] ] −> [ [ I n t ] ]
bogusFind x ys = ( [ x : zs | x : zs <− ys ] )
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
34/44
Sucre syntaxique
Séquences
Autre vision des listes
Programmation
Fonctionnelle
Didier Verna
E PITA
Généralités :
I
I
Syntaxe
I
Expressions
Typage
I
Conditionnels
Nombres
Listes
Sqrt
35/44
Vision des listes comme séries ordonnées d’éléments
Concept optionnel du point de vue théorique
Exemples : chaînes de caractères, vecteurs (natifs en
Lisp). . .
Typage : séquences homogènes en Haskell,
hétérogènes en Lisp
Lisp :
I
Fonction (elt seq pos), équivalent à nth mais pour
tout type de séquence.
Chaînes de caractères
« chaîne » ⇔ liste ou vecteur
Programmation
Fonctionnelle
Didier Verna
E PITA
Caractères :
I
I
Syntaxe
I
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
I
Chaînes :
I
I
I
I
36/44
Expression littérale : ’c’ (Haskell), #\c (Lisp)
Type Haskell : Char, prédicat Lisp : characterp
Encodage : char-code et code-char (Lisp), ord et
chr (Haskell)
Comparaison (Lisp) : char=, char>=, char/= etc.
Expression littérale : "abcde"
Type Haskell : String ⇔ [Char]
Type Lisp : vecteur de caractères. Prédicat stringp.
Caractères spéciaux : \n (Haskell), ~% (Lisp)
Listes vs. vecteurs de caractères
Haskell vs. Lisp
Programmation
Fonctionnelle
Haskell :
Didier Verna
E PITA
I
I
Syntaxe
Le type String est un alias du type [Char].
Tout ce qui marche sur les listes s’applique
(constructeur, générateurs, compréhensions).
Expressions
Typage
Haskell
Conditionnels
’a ’ :
[ ’a’
[ ’a’
[c |
Nombres
Listes
’b’: ’c ’:[]
. . ’c ’ ]
, ’ c ’ . . ’z ’ ]
c <− "abc" , c > ’ b ’ ]
Sqrt
Lisp :
I
Listes et chaînes (vecteurs) sont deux choses
différentes.
Lisp
"abc"
(#\ a #\b #\ c )
37/44
Recherche / indexation / filtrage
Manipulation de séquences
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Typage
Conditionnels
Recherche :
I
I
Indexation :
I
I
Nombres
Listes
Sqrt
Lisp : (position elt seq &key ...)
Haskell :
elemIndex :: Eq a => a -> [a] -> Int
Filtrage :
I
I
38/44
Lisp : (member elt lst &key ...) (réservé aux
listes), (find elt seq &key ...)
Haskell : elem :: Eq a => a -> [a] -> Bool
Lisp : (remove elt seq &key ...)
Note : clé :count
Haskell : delete :: Eq a => a -> [a] -> [a]
Note : seulement le premier élément
Contraction, Extraction
Sur-/sous-séquences
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Concaténation :
I
I
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
Sous-séquences :
I
I
Haskell : take, drop :: Int -> [a] -> [a]
Lisp : (subseq seq first &optional last)
Autres :
I
39/44
Haskell : opérateur (++) :: [a] -> [a] -> [a]
Fonction concat :: [[a]] -> [a]
Lisp : append, (concatenate type &rest elts)
Attention : append ne copie pas son dernier argument,
concatenate copie tout.
reverse, length
La méthode de Newton-Raphson
Approche par itérations successives
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
√
x = lim yn
n→+∞
| yn =
x
yn−1 + yn−1
2
Typage
Conditionnels
Nombres
Listes
Sqrt
41/44
Itérer la suite yn jusqu’à ce l’approximation soit
satisfaisante.
nrsqrt en Lisp
Approche fonctionnelle (pure)
Programmation
Fonctionnelle
Didier Verna
E PITA
Lisp
( defun n r s q r t ( x d e l t a )
( nrfind x 1f0 delta ) )
Syntaxe
Expressions
Typage
( defun n r f i n d ( x yn d e l t a )
( i f ( nrhappy yn x d e l t a )
yn
( n r f i n d x ( n r n e x t yn x ) d e l t a ) ) )
Conditionnels
Nombres
Listes
Sqrt
42/44
( defun nrhappy ( yn x d e l t a )
( <= ( abs (− x (∗ yn yn ) ) ) d e l t a ) )
( defun n r n e x t ( yn x )
( / (+ yn ( / x yn ) ) 2 ) )
nrsqrt en Haskell
Approche fonctionnelle (pure)
Programmation
Fonctionnelle
Didier Verna
E PITA
Haskell
n r s q r t : : F l o a t −> F l o a t −> F l o a t
n r s q r t x d e l t a = n r f i n d x 1.0 d e l t a
Syntaxe
Expressions
Typage
Conditionnels
Nombres
Listes
Sqrt
43/44
n r f i n d : : F l o a t −> F l o a t −> F l o a t −> F l o a t
n r f i n d x yn d e l t a
| nrhappy yn x d e l t a = yn
| otherwise = n r f i n d x ( n r n e x t yn x ) d e l t a
nrhappy : : F l o a t −> F l o a t −> F l o a t −> Bool
nrhappy yn x d e l t a = abs ( x − yn ∗ yn ) <= d e l t a
n r n e x t : : F l o a t −> F l o a t −> F l o a t
n r n e x t yn x = ( yn + x / yn ) / 2
Ou bien ? . . .
Approche carrément pas fonctionnelle pas pure du tout
Programmation
Fonctionnelle
Didier Verna
E PITA
Syntaxe
Expressions
Lisp
( defun n r s q r t ( x d e l t a )
( loop f o r y = 1 f 0 then ( / (+ y ( / x y ) ) 2 f 0 )
u n t i l ( <= ( abs (− x (∗ y y ) ) ) d e l t a )
f i n a l l y ( return y ) ) )
Typage
Conditionnels
Nombres
Listes
Sqrt
Rappel : « quoi faire » vs. « comment faire »
Question : un algorithme contient-il son propre
paradigme d’expression ?
Les opinions varient. . .
44/44
Téléchargement