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 :
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
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;;
En tout cas merci d'avance pour votre aide.
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;;
Bonne fin de journée à tous.
Partager