Cours alternatif d’OCaml

Logo OCaml
VII — Ordre supérieur

Entraînement

C’est l’heure de s’entraîner ! Comme d’habitude, voici un petit quiz et un exercice pour voir si vous avez compris l’ordre supérieur.

Donnez le type de ces fonctions.

let est_croissante_entre_zero_et_un f =
  f 0 < f 1
let addition = fun x y -> x + y
(* Indice : en plus d’être d’ordre supérieur, cette fonction est polymorphe *)
let point_fixe f x = (f x) = x

On va maintenant créer des fonctions d’ordre supérieur pour manipuler des listes. On définit donc un type liste polymorphe de cette façon :

type 'a liste =
  | Fin
  | Element of 'a * liste

Écrivez les fonctions suivantes :

Proposition de correction
let rec associer (f : 'a  -> 'b) (l : 'a liste) : 'b liste =
  match l with
  | Fin -> Fin
  | Element(x, suite) -> Element(f x, associer f suite)

let rec filtrer (f : 'a -> bool) (l : 'a liste) : 'a liste =
  match l with
  | Fin -> Fin
  | Element(x, suite) ->
    if f x then
      Element(x, filtrer f suite)
    else
      filtrer f suite

let rec existe (f : 'a -> bool) (l : 'a liste) : bool =
  match l with
  | Fin -> false
  | Element(x, suite) -> (f x) || (existe f suite)