|
|
|
Notes # 6: |
|
Langages de Programmation Fonctionelle II: Introduction au ML |
|
|
|
|
|
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. |
|
|
|
|
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.). |
|
|
|
|
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. |
|
|
|
|
|
|
datatype identificateur = expression_de_type |
|
|
|
Examples: |
|
datatype couleur = rouge | orange | vert; |
|
datatype arbre = nul
| noeud of int * arbre * arbre *arbre; |
|
|
|
|
|
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 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” |
|
|
|
|
|
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 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 » |
|
|
|
|
|
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... |
|
|
|
|
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 |
|
|
|
|
|
|
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. |
|
|
|
|
|
|
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. |
|