On se propose de réécrire ici les fonctions intégrées de OCaml sur les listes.
On leur donnera le nom « my_func » si « func » est le nom de la fonction Caml à réécrire.
On écrira systématiquement des filtrages par cas.
Exercice 21. Réécrire « union : ‘a list -> ‘a list -> ‘a list » (on pourra utiliser la fonction « mem ») Rappel : » union l1 l2″ concatène à « l2 » les éléments de « l1 » qui n’apparaissent pas dans « l2 ». |
Exercice 22. Réécrire « intersect : ‘a list -> ‘a list -> ‘a list » (on pourra utiliser la fonction « mem ») Rappel : « intersect l1 l2 » renvoie la sous-liste des éléments de « l1 » qui apparaissent dans « l2 ». |
Exercice 23. Réécrire la fonction « index : ‘a -> ‘a list -> int Rappel : « index a l » renvoie la position de la première occurrence de « a » dans « l ». On lève une exception si « a » n’est pas trouvé. |
Exercice 24. Réécrire la fonction « assoc : ‘a -> (‘a * ‘b) list -> ‘b Rappel : « assoc a l » renvoie l’élément « b » du couple « (a,b) » dans lequel « a » apparaît pour la première fois. On lève une exception si « a » n’est jamais le premier élément d’un couple de « l ». |
Exercice 25. Réécrire la fonction « assq : ‘a -> (‘a * ‘b) list -> ‘b Rappel : même fonctionnement que « assoc » mais en utilissant l’égalité physique. |
Exercice 26. Réécrire « mem_assoc : ‘a -> (‘a * ‘b) list -> bool » Rappel : dit si « a » est apparu comme premier élément d’un couple de « l ». |
Exercice 27. Réécrire « split : (‘a * ‘b) list -> ‘a list * ‘b list » Rappel : « split [(a1,b1);…;(an,bn)] » renvoie « ([a1;…;an], [b1;…;bn]) » |
Exercice 28. Réécrire « combine : ‘a list * ‘b list -> (‘a * ‘b) list » Rappel : « combine ([a1;…;an], [b1;…;bn]) » renvoie « [(a1,b1);…;(an,bn)] ». On lève une exception si les longueurs sont différentes. |
Exercice 29. Réécrire « map_combine : (‘a * ‘b -> ‘c) -> ‘a list * ‘b list -> ‘c list » Rappel : » map_combine [a1;…;an], [b1;…;bn] » renvoie « [f (a1,b1);…;f(an,bn)] ». On lève une exception si les longueurs sont différentes. |
Exercice 30. Réécrire la fonction « List.iter_combine : (‘a * ‘b -> unit) -> ‘a list * ‘b list -> unit » Rappel : « List.iter_combine f([a1 ;… ;an], [b1 ;… ;bn]) » effectue « f(a1,b1) ;… ;f(an,bn); ». Les résultats sont perdus. On lève une exception si les longueurs sont différentes. |