CSI3525:
Concepts des Langages de Programmation
|
|
|
Notes # 6: |
|
Langages de Programmation Fonctionelle
II: Introduction
au ML |
Introduction
|
|
|
|
ML est un langage fonctionnel a portee
locale comme le Scheme. |
|
Neanmoins, il differe du Scheme de
facon significative: |
|
Il utilise des declaration de types,
des inferences de types et il est fortement type. Scheme, au contraire,
n’utilise pratiquement pas de types. |
|
Il utilise une syntaxe plus proche du
Pascal et du C que du Scheme. |
|
ML fait du traitement d’exception et il
incorpore un module qui permet l’implementation de types de donnees
abstraites. |
Types de Donnees
Primitives et Symboles Reserves
|
|
|
Type de donnees Primitives: entiers,
reels, booleens, chaines de caracteres. |
|
Pour entiers et reels, ~ indique la negativite (e.g., ~3, ~2.4, etc.). |
|
ML reconnait les majuscules et les minuscules (e.g.,True <> true). |
|
Les caracteres de controle sont representes comme en C (e.g., \n pour aller a la ligne, \t
pour tab, etc.). |
Types de Donnees
Structurees
|
|
|
Listes Mixtes (tuples): une sequence
d’objets de types varies separes par des virgules et compris dans des
parentheses. (E.g., (12, “abc”, 3) ou
(2, “a”, (3, 4.3), “xyz”, (true, 7)) . |
|
Le nieme membre d’une liste
mixte peut etre accede par #n (e.g.: #2(2, 4, 6) = 4) |
|
Une liste est une liste mixte qui
consiste d’objets du meme type. (e.g., [“a”, “b”, “c”, “d”] ou
[[1,2],[3,4]]). |
|
nil est la liste vide. |
|
|
Types Definis par
l’Usager
|
|
|
datatype identificateur =
expression_de_type |
|
|
|
Examples: |
|
datatype couleur = rouge | orange |
vert; |
|
datatype arbre = nul |
noeud of int * arbre * arbre *arbre; |
Attachements de Valeurs a
des Identificateurs
|
|
|
|
val identificateur = expression; |
|
Example: val X = 7 |
|
Notez que “=“ n’est pas un symbole d’affectation mais plutot un
symbole d’attachement: “X = 8” retournerait “false”. |
|
De plus, une fois qu’une valeur est
attachee a X, on ne peut plus en attacher d’autre, a moins que l’on change
d’environement en utilisant la construction: |
|
let val nom_d_environement =
expression_1 in expression_2 end |
Expressions I
|
|
|
|
Expressions Arithmetiques: |
|
Negation: ~, |
|
operateurs multiplicatifs: *, /, div,
mod, |
|
operateurs additifs: +, - |
|
operateurs relationnels: =, <>,
>=, <=, >, <. |
|
Expressions Booleennes |
|
andalso, orelse, not |
|
andalso et orelse utilisent
l’evaluation paresseuse. |
|
Expressions de chaines de caracteres |
|
concatenation: ^ |
|
exemple: “abc” ^ “def” = “abcdef” |
Expressions II
|
|
|
|
Expression Conditionnelle |
|
if expression then partie_vrai else
partie_fausse |
|
la partie “else” n’est pas optionelle. |
|
Expression de Boucle |
|
while expression_1 do expression_2 |
|
expression_2 doit changer l’association
d’une variable dans l’environement
local pour que expression_1 puisse-t-etre changee. |
|
Expressions de Listes |
|
tete de liste L: hd(L) |
|
queue de liste L: tl(L) |
|
constructtion de liste: hd(L)::tl(L) =L |
|
fusion de deux listes: [1, 2] @ [3, 4]
= [1,2,3,4] |
|
coercion entre liste et chaine:
explode, implode |
Specifications et
Definitions de Fonctions
|
|
|
|
Specifications de Sequences |
|
(expression_1; expression_2;
expression_3) |
|
|
|
Definition de Fonctions |
|
|
|
fun nom_de_fonction (parametres) = expression; |
|
|
|
Exemple: fun addition(a:int, b:int):int
= a+b; |
|
|
|
Note 1: int n ’a pas besoin
d ’etre specifie partout |
|
Note2: Les fonctions peuvent etre
polymorphiques et il y a possibilite de « pattern matching » |
Exceptions
|
|
|
|
ML permet aux programmeurs de definir
des exceptions. Une exception est un evenement inhabituel (ou bien une erreur
ou non) qui peut etre detecte par le hardware ou le logiciel et qui peut
necessiter un traitement special. |
|
ML a un systeme de traitement
d’exception qui intervient lorsqu’une exception est relevee. |
|
Definition: exception nom_de_l_exception; |
|
Invocation: raise nom_de_l_exception; |
|
Traitement: expression handle
traitement avec |
|
traitement(motif1) ==> expression1 |
|
traitement(motif2) ==> expression2 etc... |
Passer des Fonctions
comme Arguments
|
|
|
Comme en Scheme, les fonctions peuvent
etre passees comme arguments: |
|
Exemple: |
|
- fun fait_x(x:int --> int, y:int)= x(y); |
|
val fait_x = fn : (int --> int) * int --> int |
|
- fun double(x)= 2*x; |
|
val double = fn : int --> int |
|
- fait_x(double,4); |
|
val it = 8 : int |
|
|
Fonctions Primitives:
Entrée/Sortie
|
|
|
use nom_de_fichier (lit un programme) |
|
print(x) (imprime un objet primitif x) |
|
open_in(“nom_de_fichier”) (ouvre nom_de_fichier et retourne un
pointeur de type instreamau fichier ouvert. |
|
input(pointeur_fichier, t) (retourne
une chaine de caracteres de longueur t constitues par les t caracteres
consecutifs du fichier de reference) |
|
end_of_stream(pointeur_fichier)
retourne vrai si la fin du fichier a ete atteinte. |
|
|
Autres Fonctions
Primitives
|
|
|
hd(liste) (retourne le 1er element de la liste) |
|
tl(liste) (retourne la liste constituee de tous les elements sauf le
premier). |
|
explode(chaine) (convertit chaine en une liste de chaines
d’un seul caractere) |
|
implode(liste) (prend une liste de chaines et retourne
une seule chaine) |
|
size(chaine) (retourne le nombre de caracteres dans la chaine) |
|
ord(x) (retourne la valeur numerique du caractere x) |
|
chr(i) (retourne le caractere represente par la valeur numerique i. |