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.