Fiche du langage Caml
Nom : Caml   (Categorical Abstract Machine Language).
Auteurs : INRIA, 1985.
Versions utilisées : OCaml (ou OCamlWin) 4.01.0.
Sites webs : Caml à l'INRIA.
Paradigme : Langage fonctionnel (fortement et) strictement typé à inférence de types, 
  avec fonctionnalités impératives.
Compilation : Interpréteurs pour Linux, Windows, Unix, MacOS X.
 
Terminateur d'instruction : ;;
Commentaire : (*   *)
Arrêt de l'interpréteur : exit(0);;
 
 
Types de données élémentaires :
- unit:
 Valeur unique :- ()
 ce type est utilisé formellement pour une fonction de zéro variable :- let f()=...
- Booléen (voir la comparaison dans le schéma alternatif) :
 
 Nom :bool
 Valeurs :truefalse
 Opérateurs logiques :not||(OU)&&(ET, ne pas utiliserand!!)
- Entier :
 
 Nom :int
 Valeurs : [–2n-1..2n-1[ (pour un codage sur n bits)
 Constantes :min_intmax_int
 Opérateurs :+–*/(DIV)mod
 Fonctions :float_of_intchar_of_int...
- Réel :
 
 Nom :float
 Valeurs :[min_float;max_float](précision dépendant du processeur)
 Opérateurs :+.–.*./.(ne pas oublier le point!)**(puissance réelle)
 Fonctions :int_of_float(partie entière)   ...
- Caractère :
 
 Nom :char
 Valeurs : caractères de code ASCII étendu 0 à 255 (N.B. problème des caractères accentués)
 Délimiteur de constante : apostrophe (exemple :'a')
 Constantes :\n\tetc.
 Fonctions :int_of_char...
- Chaîne de caractère :
 
 Nom :string
 Délimiteur de constante : guillemets (exemple :"abcdef")
 Opérateurs :^(concaténation).[n](n+1-ième caractère de la chaîne :"bonjour".[0];;→- : char = 'b')
 Fonctions :String.length
 
Variables :
- Nommage : un identificateur de variable commence par une lettre minuscule 
 non accentuée (lexique sensible à la casse) 
- Affectation : let v=4;;→val v : int = 4
 avec inférence de type :let w=v+3;;(w est de type entier)let w="abcdef";;(w devient de type chaîne)
 avec typage stricte :5+3.2;;→Error: This expression has type float but an expression 
                     was expected of type int
- Affectation locale (contextuelle) : let v=5 in v+9;;(la valeur 5 pourvn'est utilisée que dans l'expressionv+9)
- Affectation parallèle : 
 
 let v=5 and w=6;;→val v : int = 5val w : int = 6
 let v=5 and w=6 in v+w;;
 let x=10 in let y=20 and z=x in x+y+z;;
 
Le type fonction ( f : x→f(x) ) :
- Opérateur de fonction : ->(associatif à droite :int->int->intest interprété commeint ->(int->int))
- Fonction anonyme :
 
 function x-> x+1;;
 fun x-> x+1;;
 →-: int->int = <fun>
- Fonction nommée (quatre formes de définition) :
 
 let f = function x -> x+1;;
 let f = fun x -> x+1;;
 let f(x) = x+1;;
 let f x = x+1;;
 →val f : int->int = <fun>
- Fonctions de plusieurs variables :
 
 let g(x,y) = x+y;;→val g : int * int -> int = <fun>(forme cartésienne : (x,y) est un produit cartésien)
 let g x y = x+y;;→val g : int -> int -> int = <fun>(forme curryfiée : sous forme de listeg x y).
- Récursivité :
 
 let rec fact n = if n=0 then 1 else fact (n-1);;
- Fonctions d'ordre supérieur :
 définies comme des fonctions prenant en paramètre une fonction : 
  let compose f g x = f(g(x));
 Fonctions d'ordre supérieur prédéfinies sur les listes :
 –List.map (fun x->x*10) [1;2;3;4]→[10;20;30;40]
 –List.filter (fun x->x>0) [-1;1;-2;2;-3;3]→[1;2;3]
 –List.fold_right
 –List.fold_left
 
Types de données élaborés :
- Type énuméré (type somme) :
 
 - Type énuméré simple
  
 type unique = Val;;(N.B. les constructeurs [càd valeurs du type] commencent par une majuscule : Val)
 let x=Vallee;;→val x : unique = Vallee
 type multiple = Vallee | Montagne | Plateau;;
 let y=Montagne;;→val y : multiple = Montagne
 let z=Vallee;;→val z : multiple = Vallee
 let (t:unique)=Vallee;;→val t : unique = Vallee(forçage de type)
- Type énuméré avec valuation(s)
  
 type humain = Femme | Homme of int;;
 let h = Homme(18);;
 type animal = Chien of string | Chat of String;;
 let monchien = Chien("Medor")→val monchien = Chien "Medor"
 
- Type produit cartésien :
 
 - Utilisation implicite :
 
 let p = (1.1, 2.2);;→val m : float * float = (1.1,2.2)
- Définition et utilisation d'un type :
 
 type point = float * float;;→type point = float * float
 let p = (1.1, 2.2);;→val p : float * float = (1.1,2.2)
 let (p:point) = (1.1, 2.2);;→val p : point = (1.1,2.2)(forçage de type)
- Emboitage de type possible : 
  
 type adoption = humain * animal;;
 type triangle = point * point * point;;
- Fonctions de sélection dans un doublet :
  
 fst(1,2)→- : int = 1
 snd(1,2)→- : int = 2
 Attention :fst(1,2,3)→Error: ...
 
- Types paramétrés ('a,'b,'c, ...) :
 - Type polymorphe :
  
 type 'a boite = Vide | Contient of 'a;;→type 'a boite = Vide | Contient of 'a
 Contient(6);;→- : int boite = Contient 6
 Contient('A');;→- : char boite = Contient 'A'
 Vide;;→- : 'a boite = Vide
- Type anonyme (inférence de type impossible)
  
 let f x y = x<y;;→val f : 'a -> 'a -> bool = <fun>
 let g x y z t = (x<y)||(z<t);;→val f : 'a -> 'a -> 'b -> 'b -> bool = <fun>
 
- Types récursifs :
 
 type poupeerusse = Vide | Contient of poupeerusse;;
 let p= Vide;;let q= Contient (Contient (Contient Vide));;
 
Le type liste   ('a list : liste d'objet d'un même type)
 
Liste vide : []
 
Eléments d'un même type séparés par des point-virgules : 
  [10;-1;3]   
  ['g';'m';'a']  
  ["a";"de";"par";"pour"]  
  [(1,2);(9,1);(2;7)]  
  [[1;8;2];[4;6;7]]  
 
Opérateur de concaténation @ : 
    [1;2]@[3;4;5];; → [1;2;3;4;5]
 
Opérateur d'ajout en tête :: : 
    1::[2;3;4];; → [1;2;3;4;]
 
 
 
 
Schémas de programmation : 
- 
Schéma alternatif :
- Comparaisons : 
 une comparaison est une expression valide de type booléen. Exemple : 
 5>=0;;→-: bool = true
- Opérateurs de comparaison : 
 =(ne pas utiliser==)<>(ne pas utiliser!=)<=<>=>
 N.B. les mêmes symboles sont utilisés pour int, float, char & string, mais
     une comparaison ne peut concerner que deux objets de même type !
- Conditionnelle : ifconditionthenconséquenceelse alternative
 La condition est un booléen correspondant normalement à une comparaison
 N.B. L'alternative est obligatoire et doit être du même type que la conséquence :if v==5 then "cinq" else "autre";;mais pasif c=='a' then 'A' else "autre";;
 
- 
Schéma sélectif (=filtrage) :
 match (x mod 2) with 0 -> "pair" | 1 -> "impair";;
 match b with Vide -> 0 | Contient(n) -> n;;
 match v with (0,0) -> "origine" | _ -> "autre";;;
 match p with (0,0) -> 0 | (0,m) -> m | (n,0) -> n | (n,m) -> n*m ;;;
 N.B. le schéma doit être complet en prévoyant tous les cas possibles 
(au besoin en utilisant le motif générique_)
 Commande optionnellewhen:
 match s with [] -> 0
   | a::b when a<0 -> 1
   | a::b -> 0;;
 
- 
Schémas itératifs :  ils existent en Caml mais ne doivent pas être utilisées en TD 
(Tantque, Répéter, Pour)
 
...
 
  ©   2017-07-01   –   A. Sigayret