Bonjour à tous, ayant commencé Ocaml il y a peu (de manière purement fonctionnelle) il y a des choses que je ne comprends pas, surtout sur la syntaxe, l'indentation propre, la place des parenthèses, des points-virgules simples (j'ai compris l'utilité des ";;" qui servent à finir une instruction). Je suis surtout déconcerté face à un petit code sur le tri fusion, le premier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
let rec decoupe l = (* fonction qui découpe une liste en deux sous listes en alternant "gauche droite" *)
	match l with
	|x::y::ll -> let (l1,l2) = decoupe ll in
		(x::l1,y::l2)
	|x::ll -> let (l1,l2) = decoupe ll in
		(x::l1,l2)
	|[] -> ([],[]);;
 
(* relations d'ordres pour des scalaires *)
 
let sup x y =
	if x > y = true then true
	else false;;
let inf x y =
	if x < y = true then true
	else false;;
 
(* entrelacement des listes sans généricité *)
 
let rec fusion l1 l2 =
	match (l1,l2) with
	|([],[]) -> []
	|(x::ll1,[]) -> let l = fusion ll1 [] in x::l
	|([],y::ll2) -> let l = fusion [] ll2 in y::l
	|(x::ll1,y::ll2)-> if (x > y) = false
		then let l = fusion ll1 l2 in 
			x::l
		else let l = fusion l1 ll2 in
			y::l;;
 
(* tri fusion sans généricité *)
let rec tri_fusion l =
	match l with
	|[] -> [];
	|x::[] -> l;
	|_ -> 
		begin
			let (l1,l2) = decoupe l in 
			fusion (tri_fusion (l1)) (tri_fusion (l2));
		end;;
qui est totalement opérationnel, tandis que le second qui se veut générique (donc modification de la fusion et du tri fusion) ne fonctionne pas du tout (syntaxe invalide) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
let rec fusion l1 l2 rel = (* rel étant la relation d'ordre utilisée *)
	match (l1,l2) with
	|([],[]) -> []
	|(x::ll1,[]) -> let l = fusion ll1 [] rel in x::l
	|([],y::ll2) -> let l = fusion [] ll2 rel in y::l
	|(x::ll1,y::ll2)-> if (rel x y) = false
		then let l = fusion ll1 l2 rel in 
			x::l
		else let l = fusion l1 ll2 rel in
			y::l;;
let rec tri_fusion l rel = 
	match l with
	|[] -> [];
	|x::[] -> l;
	|_ -> 
		begin
			let (l1,l2) = decoupe l in 
			fusion (tri_fusion (l1) rel) (tri_fusion (l2) rel) rel;
		end;;
En tout cas merci d'avance pour votre aide.
Bonne fin de journée à tous.