#string_length;; - : string -> int = <fun> ##close "string";; #string_length;; Entrée interactive: >string_length;; >^^^^^^^^^^^^^ L'identificateur string_length n'est pas défini. ##open "string";;
#random__init;; - : int -> unit = <fun> #random__int;; - : int -> int = <fun> ##open "random";; #init;; - : int -> unit = <fun>
Unix: $ camllight camlgraph > Caml Light version 0.74 ##open "graphics";; #open_graph "";; - : unit = () #draw_circle 200 200 50;; - : unit = () #close_graph ();; - : unit = () ##close "graphics";; #open_graph "";; Entrée interactive: >open_graph "";; >^^^^^^^^^^ L'identificateur open_graph n'est pas défini.à comparer avec
Unix: $ camllight > Caml Light version 0.74
##open "graphics";; #open_graph "";; La valeur globale graphics__open_graph est utilisée avant d'être définie. Veuillez charger une implémentation du module graphics.
function paramètre -> expression_du_corps_de_la_fonction;;
#function a -> if a < 0 then -a else a;; - : int -> int = <fun>nommée
let nom_de_la_fonction = function paramètre -> expression_du_corps_de_la_fonction;;ou
let nom_de_la_fonction paramètre = expression_du_corps_de_la_fonction;;
#let abs = function a -> if a < 0 then -a else a;; abs : int -> int = <fun> #let abs a = if a < 0 then -a else a;; abs : int -> int = <fun> #let carré = function x -> x * x;; carré : int -> int = <fun>
#let polynôme = function x -> let a = 2 and b = -3 and c = 5 in a * x * x + b * x + c;; polynôme : int -> int = <fun> #let répéter = function s -> s ^ s;; répéter : string -> string = <fun> #let est_vide = function s -> s = "";; est_vide : string -> bool = <fun>appliquée
#carré 5;; - : int = 25 #carré(5);; - : int = 25 #carré (4 - 5);; - : int = 1 #carré 4 - 5;; - : int = 11 #répéter "cou";; - : string = "coucou"
let nom_de_la_fonction p1 ... pn = expression_du_corps_de_la_fonction;; let nom_de_la_fonction = function p1 -> ... -> function pn -> expression_du_corps_de_la_fonction;;
#let surface_rectangle long large =
long *. large;;
surface_rectangle : float -> float ->
float = <fun>
#let surface_rectangle =
function long ->
function large -> long *. large;;
surface_rectangle : float -> float ->
float = <fun>
#surface_rectangle 1.4 2.4;;
- : float = 3.36
#let const=3;; const : int = 3 #let f = function x -> x*const;; f : int -> int = <fun> #f 1;; - : int = 3 #let const=6;; const : int = 6 #f 1;; - : int = 3
t1 -> t2, si
t1 est le type du paramètre formel x et t2 le
type de l'expression expr
#let identité = function x -> x;; identité : 'a -> 'a = <fun> #identité 3;; - : int = 3 #identité true;; - : bool = true #identité "une chaîne";; - : string = "une chaîne"identité est une fonction polymorphe.
#let H = function x -> if x = 1 then failwith "H: indéfini" else 1 / (x - 1);; H : int -> int = <fun> #let prédécesseur = function y -> if y <= 0 then failwith "paramètre non naturel" else y - 1;; prédécesseur : int -> int = <fun> #H 5;; - : int = 0 #H 1;; Exception non rattrapée: Failure "H: indéfini" #prédécesseur 2;; - : int = 1
#prédécesseur (-5);; Exception non rattrapée: Failure "paramètre non naturel" #carré (H (3-abs(2)));; Exception non rattrapée: Failure "H: indéfini" #failwith;; - : string -> 'a = <fun>
#let fact = function n -> if n <= 0 then 1 else n*fact(n-1);; Entrée interactive: > if n <= 0 then 1 else n*fact(n-1);; > ^^^^ L'identificateur fact n'est pas défini. #let rec fact = function n -> if n <= 0 then 1 else n*fact(n-1);; fact : int -> int = <fun> #let rec fib = function n -> if n <= 1 then 1 else fib (n-1)+fib(n-2);; fib : int -> int = <fun> #let rec pgcd = function a -> function b -> if b = 0 then abs a else pgcd b (a mod b);; pgcd : int -> int -> int = <fun>
#let rec pair = function n -> if n=0 then true else impair (n-1) and impair = function n -> if n=0 then false else pair (n-1);; pair : int -> bool = <fun> impair : int -> bool = <fun> #impair 10;; - : bool = false #pair 10;; - : bool = true #impair 11;; - : bool = true #pair 11;; - : bool = false
#[1; 2; 3];; - : int list = [1; 2; 3] #[true; 1 < 2];; - : bool list = [true; true] #[(function x -> x+2); succ; abs];; - : (int -> int) list = [<fun>; <fun>; <fun>] #[1; 2; "trois"];; Entrée interactive: >[1; 2; "trois"];; >^^^^^^^^^^^^^^^ Cette expression est de type string list, mais est utilisée avec le type int list.
#[[1; 2]; [2; 3; 4]; [9]];; - : int list list = [[1; 2]; [2; 3; 4]; [9]]La liste vide pourra être considérée comme une liste d'entiers, une liste de chaînes, une liste d'objets de type t pour tout type t selon le contexte d'utilisation.
#if (1>2) then [1] else [];; - : int list = [] #[["a"; "b"]; []; ["c"]] ;; - : string list list = [["a"; "b"]; []; ["c"]] #[];; - : 'a list = []
x::l dénote la liste composée
de l'élément x puis des éléments de l. Si l
est de type t list, x doit être de type t.
#1::[2];; - : int list = [1; 2] #true::[2];; Entrée interactive: >true::[2];; > ^^^ Cette expression est de type int list, mais est utilisée avec le type bool list. #1::(2::(3::[]));; - : int list = [1; 2; 3]
#let tête = function l -> match l with | [] -> failwith "tête: liste vide" | x::l' -> x;; tête : 'a list -> 'a = <fun> #tête [];; Exception non rattrapée: Failure "tête: liste vide" #tête [1; 2; 3];; - : int = 1La fonction tête est disponible en Caml sous le nom hd.
#let reste = function l -> match l with | [] -> failwith "reste: liste vide" | x::l' -> l';; reste : 'a list -> 'a list = <fun> #let reste = function l -> match l with | [] -> failwith "reste: liste vide" | _::l' -> l';; reste : 'a list -> 'a list = <fun> #reste [];; Exception non rattrapée: Failure "reste: liste vide" #reste [1; 2; 3];; - : int list = [2; 3]La fonction reste est disponible en Caml sous le nom tl.
zéro_en_tête
#let zéro_en_tête = function l -> match l with | [] -> false | x::l' -> x=0;; zéro_en_tête : int list -> bool = <fun> #let zéro_en_tête = function l -> match l with | 0::_ -> true | _ -> false;; zéro_en_tête : int list -> bool = <fun> #zéro_en_tête [];; - : bool = false #zéro_en_tête [1; 2; 3];; - : bool = false #zéro_en_tête [0; 1; 2; 3];; - : bool = true
#let zéro_en_tête = function l -> match l with | _ -> false | 0::_ -> true;; Entrée interactive: >| 0::_ -> true;; > ^^^^ Attention: ce cas de filtrage est inutile. zéro_en_tête : int list -> bool = <fun> #zéro_en_tête [0; 1; 2; 3];; - : bool = false
#let élément2 = function l -> match l with | x1::x2::l' -> x2 | _ -> failwith "élément2: |liste| < 2";; élément2 : 'a list -> 'a = <fun> #let élément2 = function l -> match l with | _::x2::_ -> x2 | _ -> failwith "élément2: |liste| < 2";; élément2 : 'a list -> 'a = <fun>
#élément2 [];; Exception non rattrapée: Failure "élément2: |liste| < 2" #élément2 [1];; Exception non rattrapée: Failure "élément2: |liste| < 2" #élément2 [1;2;3];; - : int = 2 #let élément2 = function l -> tête (reste l);; élément2 : 'a list -> 'a = <fun> #élément2 [];; Exception non rattrapée: Failure "reste: liste vide" #élément2 [1];; Exception non rattrapée: Failure "tête: liste vide" #élément2 [1;2;3];; - : int = 2
x::l, _, x::_, x1::x2::_. Le
filtre permet non seulement de préciser la forme attendue mais aussi
d'extraire et de nommer certaines parties d'une valeur.
match exp with | filtre1 -> exp1 ... | filtren -> expnoù exp, exp1, ..., expn sont des expressions et filtre1, ..., filtren sont des filtres.
#let tête_imparfaite = function l ->
match l with
| x::_ -> x;;
Entrée interactive:
>match l with
>| x::_ -> x..
Attention: ce filtrage n'est pas
exhaustif.
tête_imparfaite : 'a list -> 'a = <fun>
#tête_imparfaite [1;2;3];;
- : int = 1
#tête_imparfaite [];;
Exception non rattrapée: Match_failure
("", 3349, 3373)
Récapitulatif des filtres de listes_ comme cas par défaut ou pour éviter de nommer
un identificateur qui n'apparaît pas dans le corps de ce cas
:: avec un
élément que l'on peut lui-même filtrer et une liste que l'on peut
filtrer elle aussi (filtre::filtre).
x::_ ne filtre pas les listes commençant par x, mais
toutes les listes en nommant x son premier élément
indépendamment de l'identificateur x préexistant et dans
l'expression associée au filtre x correspond au premier
élément de la liste filtrée. Si on veut filtrer les listes commençant
par x, alors il faut écrire y::_ when y=x. Le
when condition s'appelle la garde du filtre.
#let rec length = function l -> match l with | [] -> 0 | _::l' -> 1+(length l');; length : 'a list -> int = <fun> #length [1; 2; 3];; - : int = 3La fonction length est prédéfinie comme
list_length.#let rec member = function e -> function l -> match l with | [] -> false | x::l' -> if e=x then true else member e l';; member : 'a -> 'a list -> bool = <fun> #let rec member = function e -> function l -> match l with | [] -> false | x::l' -> e=x || (member e l');; member : 'a -> 'a list -> bool = <fun>
#let rec member = function e -> function l -> match l with | [] -> false | x::_ when x=e -> true | _::l' -> member e l';; member : 'a -> 'a list -> bool = <fun> #member 0 [1; 2; 3];; - : bool = false #member 2 [1; 2; 3];; - : bool = true #member 2 [3; 2; 1];; - : bool = trueLa fonction member est prédéfinie sous le nom de
mem en Caml.#let rec member_sort = function e -> function l -> match l with | [] -> false | x::l' -> e=x || (x<e && (member_sort e l'));; member_sort : 'a -> 'a list -> bool = <fun>
#let rec member_sort = function e -> function l -> match l with | [] -> false | x::_ when x=e -> true | x::_ when x>e -> false | _::l' -> member_sort e l';; member_sort : 'a -> 'a list -> bool = <fun> #member_sort 0 [1; 2; 3];; - : bool = false #member_sort 2 [1; 2; 3];; - : bool = true #member_sort 2 [3; 2; 1];; - : bool = false
#let rec dernier = function l -> match l with | [] -> failwith "dernier: liste vide" | [x] -> x | _::l' -> dernier l';; dernier : 'a list -> 'a = <fun>
#dernier [3; 2; 4; 5; 1];; - : int = 1
#let rec max_list = function l -> match l with | [] -> failwith "max_list: liste vide" | [x] -> x | x::l' -> max x (max_list l');; max_list : 'a list -> 'a = <fun> #max_list [3; 2; 4; 5; 1];; - : int = 5
[i; i+1; ...; j] º i::[i+1; ...; j]
#let rec intervalle =
function i -> function j ->
if i = j then [i]
else i::(intervalle (i+1) j);;
intervalle : int -> int -> int list =
<fun>
#intervalle 1 10;;
- : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9;
10]
#let rec termes_pairs = function l -> match l with | [] -> [] | x::l' -> if x mod 2 = 0 then x::(termes_pairs l') else (termes_pairs l');; termes_pairs : int list -> int list = <fun> #let rec termes_pairs = function l -> match l with | [] -> [] | x::l' when x mod 2 = 0 -> x::(termes_pairs l') | _::l' -> (termes_pairs l');; termes_pairs : int list -> int list = <fun> #termes_pairs [1; 2; 3; 4; 5];; - : int list = [2; 4]
#let rec remplace = function avant ->
function après -> function l ->
match l with
| [] -> []
| x::l' ->
if x = avant
then après::(remplace avant après l')
else x::(remplace avant après l');;
remplace : 'a -> 'a -> 'a list -> 'a list
= <fun>
#let rec remplace = function avant ->
function après -> function l ->
match l with
| [] -> []
| x::l' when x=avant ->
après::(remplace avant après l')
| x::l' -> x::(remplace avant après l');;
remplace : 'a -> 'a -> 'a list -> 'a list
= <fun>
#remplace 1 (-1) [1; 2; 1; 4; 100];;
- : int list = [-1; 2; -1; 4; 100]
#let rec append = function l1 -> function l2 -> match l1 with | [] -> l2 | x::l'1 -> x::(append l'1 l2);; append : 'a list -> 'a list -> 'a list = <fun> #append ["a"; "b"; "c"] ["d"; "ef"];; - : string list = ["a"; "b"; "c"; "d"; "ef"] #append [1; 2; 3] [];; - : int list = [1; 2; 3] #let l = [3; 4];; l : int list = [3; 4] #append l l;; - : int list = [3; 4; 3; 4] #l;; - : int list = [3; 4]Cette fonction est prédéfinie dans le système : (append l1 l2) s'écrit l1 @ l2 en utilisant la primitive de Caml Light.
#let paire1 = (1, "toto");; paire1 : int * string = 1, "toto" #let paire2 = (succ, "une fonction");; paire2 : (int -> int) * string = <fun>, "une fonction" #(succ 5, let s = "ab" in s ^" "^s);; - : int * string = 6, "ab ab"
#let axe_des_x = function n -> (n, 0.0);; axe_des_x : 'a -> 'a * float = <fun> #axe_des_x 1.5;; - : float * float = 1.5, 0.0
#let carré_norme = function v ->
match v with
| (x,y) -> x *. x +. y *. y;;
carré_norme : float * float -> float =
<fun>
#carré_norme (2.0, 3.0);;
- : float = 13.0
#let carré_norme = function (x,y) ->
x *. x +. y *. y;;
carré_norme : float * float -> float =
<fun>
#let PS =
function (x,y) -> function (x',y') ->
x *. x' +. y *. y';;
PS : float * float -> float * float ->
float = <fun>
#let proj1 = function (x,y) -> x;;
proj1 : 'a * 'b -> 'a = <fun>
#proj1 (2,3);;
- : int = 2
#proj1 ("toto", true);;
- : string = "toto"
#proj1 ((3,4), 5);; - : int * int = 3, 4 #proj1 (proj1 ((3,4), 5));; - : int = 3
#let rec div = function a -> function b -> if b=0 then failwith "diviseur nul" else if a<b then (0,a) else match div (a-b) b with | (q,r) -> (q+1,r);; div : int -> int -> int * int = <fun> #let rec div = function a -> function b -> if b=0 then failwith "diviseur nul" else if a<b then (0,a) else let (q,r) = div (a-b) b in (q+1,r);; div : int -> int -> int * int = <fun>let déstructurant.
#let carré_norme = function (x, y, z) -> x *. x +. y *. y +. z *. z;; carré_norme : float * float * float -> float = <fun> #let proj1 (x, y, z) = x;; proj1 : 'a * 'b * 'c -> 'a = <fun>
#let min = function n -> function m -> if n < m then n else m;; min : 'a -> 'a -> 'a = <fun> #let min = function (n, m) -> if n < m then n else m;; min : 'a * 'a -> 'a = <fun>
type nom_du_type =
{ étiquette_1:type_de_étiquette_1;
étiquette_2:type_de_étiquette_2;
:
étiquette_n:type_de_étiquette_n
};;
let nom_d_identificateur =
{ étiquette_1 = valeur_de_étiquette_1;
étiquette_2 = valeur_de_étiquette_2;
:
étiquette_n = valeur_de_étiquette_n
};;
Les étiquettes doivent être toutes différentes.
#type date =
{Jour: int; Mois: int; Année: int};;
Le type date est défini.
#let Noël_99 =
{Jour=25; Mois=12; Année=1999};;
Noël_99 : date = {Jour = 25; Mois = 12;
Année = 1999}
#let Noël_99_bis =
{Année=1999; Mois=12; Jour=25};;
Noël_99_bis : date = {Jour = 25; Mois =
12; Année = 1999}
#Noël_99 = Noël_99_bis;;
- : bool = true
#Noël_99.Mois;;
- : int = 12
#let est_Noël = function d ->
d.Jour = 25 && d.Mois = 12;;
est_Noël : date -> bool = <fun>
#let est_Noël = function date ->
match date with
| {Jour=j; Mois=m; Année=a} ->
j=25 && m=12;;
est_Noël : date -> bool = <fun>
#let est_Noël = function date ->
match date with
| {Jour=25; Mois=12; Année=a} -> true
| _ -> false;;
est_Noël : date -> bool = <fun>
#let est_Noell = function date ->
match date with
| {Jour=25; Mois=12; _} -> true
| _ -> false;;
est_Noell : date -> bool = <fun>
type nom_du_type =
| Constructeur_1 [oftype_1]
| Constructeur_2 [oftype_2]
:
| Constructeur_n [oftype_n];;
of type_i optionnel (constructeur constant).#type saison = Printemps | Été | Automne | Hiver;; Le type saison est défini. #type boîte = | Cube of float | Parallélépipède of float*float*float;; Le type boîte est défini. #Automne;; - : saison = Automne
#Cube;; - : float -> boîte = <fun> #Cube 2.5;; - : boîte = Cube 2.5
#let est_cube = function b -> match b with | Cube c -> true | Parallélépipède (p1,p2,p3) -> false;; est_cube : boîte -> bool = <fun> #let est_cube = function b -> match b with | Cube _ -> true | Parallélépipède _ -> false;; est_cube : boîte -> bool = <fun> #let est_cube = function b -> match b with | Cube _ -> true | _ -> false;; est_cube : boîte -> bool = <fun>
#let est_printemps = function s ->
match s with
| Printemps -> true
| Été -> false
| Automne -> false
| Hiver -> false;;
est_printemps : saison -> bool = <fun>
#let est_printemps = function s ->
match s with
| Printemps -> true
| _ -> false;;
est_printemps : saison -> bool = <fun>
#let plus_grande_arête = function b ->
match b with
| Cube c -> c
| Parallélépipède (p1,p2,p3) ->
max (max p1 p2) p3;;
plus_grande_arête : boîte -> float =
<fun>
#type type_vide = C of type_vide;; Le type type_vide est défini.est une déclaration de type valide en Caml, mais il est impossible de construire aucune valeur de ce type.
#type phrase = | Point | Phrase of string * phrase;; Le type phrase est défini. #let sous_chaîne s i = sub_string s i (string_length s-i);; sous_chaîne : string -> int -> string = <fun>
#let rec char_in_string =
function c -> function s ->
not (s="") &&
(c=s.[0] ||
char_in_string c (sous_chaîne s 1));;
char_in_string : char -> string -> bool =
<fun>
#let rec search =
function c -> function s ->
if c=s.[0] then 0
else 1+(search c (sous_chaîne s 1));;
search : char -> string -> int = <fun>
#let rec coupe = function s ->
if char_in_string ` ` s then
let i = search ` ` s in
Phrase (sub_string s 0 i,
coupe (sous_chaîne s (i+1)))
else
Phrase (
sub_string s 0 (string_length s-1),
Point);;
coupe : string -> phrase = <fun>
#coupe "Une phrase se découpe en mots.";;
- : phrase =
Phrase
("Une",
Phrase
("phrase",
Phrase ("se", Phrase ("découpe",
Phrase ("en", Phrase ("mots", Point))))))
On peut comparer le type phrase au type string list
où la liste vide serait dénotée Point.
#type abr =
| Vide
| Noeud of int * abr * abr;;
Le type abr est défini.
#let mon_arbre =
Noeud (10,
Noeud (5,
Noeud (2,Vide, Vide),
Noeud (8, Vide, Vide)),
Noeud (30,
Vide,
Noeud (40, Vide, Vide)));;
mon_arbre : abr =
Noeud
(10, Noeud (5, Noeud (2, Vide, Vide),
Noeud (8, Vide, Vide)),
Noeud (30, Vide, Noeud (40, Vide,
Vide)))
#let rec member = function élém -> function a -> match a with | Vide -> false | Noeud (e, _, _) when e = élém -> true | Noeud (e, sag, _) when élém < e -> member élém sag | Noeud (e, _, sad) -> member élém sad;; member : int -> abr -> bool = <fun> #member 2 mon_arbre;; - : bool = true
#type 'a abr = | Vide | Noeud of 'a * 'a abr * 'a abr;; Le type abr est défini.Définition de type polymorphe : 'a est le paramètre de type et se lit a, alpha.
#let mon_arbre =
Noeud (10,
Noeud (5,
Noeud (2,Vide, Vide),
Noeud (8, Vide, Vide)),
Noeud (30,
Vide,
Noeud (40, Vide, Vide)));;
mon_arbre : int abr =
Noeud
(10, Noeud (5, Noeud (2, Vide, Vide),
Noeud (8, Vide, Vide)),
Noeud (30, Vide, Noeud (40, Vide,
Vide)))
#let rec member = function élém -> function a -> match a with | Vide -> false | Noeud (e, _, _) when e = élém -> true | Noeud (e, sag, _) when élém < e -> member élém sag | Noeud (e, _, sad) -> member élém sad;; member : 'a -> 'a abr -> bool = <fun> #member 2 mon_arbre;; - : bool = true
#type exp = | V of string | C of int | P of exp * exp;; Le type exp est défini. #let mon_exp = P (V "x", P (V "y", C 3));; mon_exp : exp = P (V "x", P (V "y", C 3)) #let rec dériv = function s -> function exp -> match exp with | V nom -> if s = nom then C 1 else C 0 | C _ -> C 0 | P (e1, e2) -> P (dériv s e1, dériv s e2);; dériv : string -> exp -> exp = <fun> #dériv "x" mon_exp;; - : exp = P (C 1, P (C 0, C 0))
#let pente_en_0 = function f ->
(f(0.01)-.f(0.))/.0.01;;
pente_en_0 : (float -> float) -> float =
<fun>
#let dérivée f = function x ->
(f(x+.0.001)-.f(x))/.0.001;;
dérivée : (float -> float) -> float ->
float = <fun>
#let compose =
function f -> function g ->
function x -> g (f x);;
compose : ('a -> 'b) -> ('b -> 'c) -> 'a
-> 'c = <fun>
|
ì í î |
|
#let rec iter = function n ->
function f -> function a ->
if n = 0 then a else f (iter (n-1) f a);;
iter : int -> ('a -> 'a) -> 'a -> 'a =
<fun>
#let puissance = function p -> function n ->
iter n (function x -> p*x) 1;;
puissance : int -> int -> int = <fun>
#puissance 2 15;;
- : int = 32768
Fonction sigma
#let rec somme = function n -> if n = 0 then 0 else n+(somme (n-1));; somme : int -> int = <fun> #let rec somme_carrés = function n -> if n = 0 then 0 else (n*n)+(somme_carrés (n-1));; somme_carrés : int -> int = <fun> #let rec sigma = function f -> function n -> if n = 0 then 0 else f (n)+(sigma f (n-1));; sigma : (int -> int) -> int -> int = <fun> #let somme = function n -> sigma (function n -> n) n;; somme : int -> int = <fun> #let somme_carrés = function n -> sigma (function n -> n*n) n;; somme_carrés : int -> int = <fun>Fonction map
#let rec noms_étudiants =
function liste_étudiants ->
match liste_étudiants with
| [] -> []
| (nom, notes)::l ->
nom::(noms_étudiants l);;
noms_étudiants : ('a * 'b) list -> 'a list
= <fun>
#let rec map =
function f -> function liste ->
match liste with
| [] -> []
| x::l -> (f x)::(map f l);;
map : ('a -> 'b) -> 'a list -> 'b list =
<fun>
#map (function x -> x*x) [1; 2; 3; 4; 5; 6];;
- : int list = [1; 4; 9; 16; 25; 36]
#let noms_étudiants = function l ->
map (function (nom, note) -> nom) l;;
noms_étudiants : ('a * 'b) list -> 'a list
= <fun>
Cette fonctionnelle map est prédéfinie en Caml.
#let rec filter = function p -> function l ->
match l with
| [] -> []
| x::l' ->
if (p x) then x::(filter p l')
else (filter p l');;
filter : ('a -> bool) -> 'a list -> 'a
list = <fun>
#let termes_pairs = function l ->
filter (function x -> (x mod 2 = 0)) l;;
termes_pairs : int list -> int list =
<fun>
#let est_sur_axe_x = function (x,y) -> y=0.0;;
est_sur_axe_x : 'a * float -> bool =
<fun>
#let vecteurs_axe_x = function l ->
filter est_sur_axe_x l;;
vecteurs_axe_x : ('a * float) list -> ('a
* float) list = <fun>
Insertion, tri
#let rec insérer =
function e -> function l ->
match l with
| [] -> [e]
| x::l' ->
if e < x then e::l
else x::(insérer e l');;
insérer : 'a -> 'a list -> 'a list =
<fun>
#let rec insérer priorité =
function e -> function l ->
match l with
| [] -> [e]
| x::l' ->
if priorité x e
then x::(insérer priorité e l')
else e::l;;
insérer : ('a -> 'a -> bool) -> 'a -> 'a
list -> 'a list = <fun>
#let insérer_ordre_croissant =
function e -> function l ->
insérer (prefix <) e l;;
insérer_ordre_croissant : 'a -> 'a list ->
'a list = <fun>
#let insérer_ordre_décroissant =
insérer (prefix >);;
insérer_ordre_décroissant : '_a -> '_a
list -> '_a list = <fun>
#let rec tri_insertion =
function priorité -> function liste ->
match liste with
| [] -> []
| e::l ->
insérer priorité e
(tri_insertion priorité l);;
tri_insertion : ('a -> 'a -> bool) -> 'a
list -> 'a list = <fun>
#let tri_insertion_ordre_croissant =
function l -> tri_insertion (prefix <) l;;
tri_insertion_ordre_croissant : 'a list ->
'a list = <fun>