arités | forme curryfiée |
f: 2, g: 2, h: 2 | ( f (h x y) (g z t) |
f: 3, g: 2, x: 1 | (f h ( g (x h) y) z) |
f: 4, h: 2, z: 1 | ( f g (h x y) (z x) t) |
type chiffre = Zero | Un | Deux |Trois | Quatre | Cinq | Six | Sept | Huit | Neuf;;
type panier = Pomme of int | Poire of int | Peche of int;;
let papom = Pomme 10;;
let papoi = Poire 6;;
type operateur = Plus | Moins | Multiplie | Divisepar;;
let calculer op m n =
if op=Plus then (m+n)
else if op=Moins then (m-n)
else if op=Multiplie then (m*n)
else (m/n);;
type complexePur = Reel of float | Imaginaire of float;;
type dbl_ent = int * int;;
type dbl_reel = float * float;;
type dbl_ec = dbl_ent * dbl_reel;;
let tranformer ((n,p),(x,y)) = ( float_of_int(n)*.x , float_of_int(p)*.y );;
type point2
= float * float;;let abscisse (x:point2) = fst x;;
let ordonnee (x:point2) = snd x;;
type point3 = float * float * float;;
fst
et snd
pour des types produits de plus de deux types.let projection ((x,y,z):point3) = ((x,y+z):point2);;
type vecteur = float * float * float;;
let vectoriser ((x1,y1,z1):point3) ((x2,y2,y2):point3) = (x2-.x1, y2-.y1, z2-.z1):vecteur;;
type individu = string * string * int;;
let (d:individu) = ("Tsing", "Tao", 98);;
type nom = Nom of string;;
type prenom = Prenom of string;;
type age = Age of int;;
age
qui est le nom du type et
Age
est un identificateur abstrait, on aurait pu faire une autre
choix, tel que : type age = Annee of int.
3.type personne = nom * prenom * age;;
let p = ( Nom "DURAN", Prenom "Alice", Age 20);;
let extraireNom (Nom n, Age a) = n;;
let extraireAge (Nom n, Age a) = a;;
type | fonction |
'a→int | let f1 x = 1;; |
'a→'a | let f2 x = x;; |
'a→unit | let f3 = ();; |
int→int | let f4 x = x+1;; |
'a→'b→'a | let f5 x y = x;; |
'a→'b→'b | let f6 x y = y;; |
'a→int→int | let f7 x y = y+1;; |
'a→int→'a | let f8 x y = if y>0 then x else x;; |
'a&raarr;('a→'b)→'b | |
'a→('a→int)→int | let f10 x f = f(x)+1;; |
int→(int→'a)→'a | lt f11 x = f(x+1);; |
('a→'b)→('b→'c)→'a→'c | let f12 f g x = g(f(x));; |
let prefixeIF x y z =
if x=Plus then y+z
else if x=Moins then y-z
else if x=Multiplie then y*z
else y/z;;
let prefixeMATCH x y z = match x with
| Plus −> y+z
| Moins −> y-z
| Multiplie −> y*z
| Divisepar −> y/z;;
let nullite n = match n with
| 0 minus;> 0
| _ minus;> 1;;
let unoudeux n = match with
| 1 minus;> 1
| 2 minus;> 2;;
let doublenul x y = match (x,y) with
| (0,_) −> 0
| (_,0.) −> 1
| _ −> 2;;
let minuscule = match s.[0] with
|'a' −> 'v'
|
...
| 'y' −> 'v'
| _ −> '-';;
let position x = match x with
| (0,0) −> "origine"
| (0,_) −> "abscisse"
| (_,0) −> "ordonnee";;
let xor a b = if a==b then false else true;;
let xor a b = ;;
let xor a b = match (a,b) with
| (true,true) −> false
| (true,false) −> true =
| (false,true) −> true
| (false,false) −> false;;
let xor a b = match (a,b) with
| (true,false) −> true =
| (false,true) −> true
| _ −> false;;
let xor a b = not (a==b);;
let combien p = match p with
| Poire n minus;> n
| Pomme n minus;> n
| Peche n minus;> n;;
if
expression then
conséquence
else
alternative par
match
expression with | true −>
conséquence with | _ −>
alternative,
mais quel intérêt ??match
est plus puissante que ce que pourrait offrir une suite
de if
imbriqués (voir l'exercice précédent).