Programmation Fonctionnelle, TD1

Version & licenses
Creative Commons License

Programmation Fonctionnelle, TD1 : Découverte d'Ocaml.

Guyslain Naves

Découverte de Ocaml

Définition de fonctions

Définir les fonctions suivantes en Ocaml. Quel est le type de chacune ?

  1. La fonction identité, qui prenant un argument $x$, s'évalue en $x$.
  2. La fonction maximum de deux entiers, et la fonction minimum.
  3. La fonction factorielle : $n! = n \times (n-1)!$ pour $n > 0$, $0! = 1$.
  4. La fonction puissance entière : $a^b = a * a^{b-1}$ si $b > 0$, $a^0 = 1$.
  5. La fonction de Fibonacci : $f_n = f_{n-1} + f{n-2}$ si $n>1$, $f_1 = f_0 = 1$.

Bonus : faire des version efficaces de la puissance et de Fibonacci.

À savoir : max et min sont déjà définies en Ocaml. Ce sont des fonctions polymorphes prenant deux arguments, leur type est \ verb|'a -> 'a -> 'a|.

Couples et $k$-uplets

Définir les fonctions suivantes en Ocaml. Préciser leurs types.

  1. duplicate prend un entier $n$ et s'évalue (avec son argument) en le couple $(n,n)$.
  2. fst prend un couple $(x,y)$, et s'évalue en $x$.
  3. snd prend un couple $(x,y)$, et s'évalue en $y$.
  4. max_couple prend deux couples $(x_1,y_1)$ et $(x_2,y_2)$, et s'évalue en $(\max\{x1,x2\}, \max\{y1,y2\})$.
  5. swap prend un couple $(x,y)$, et s'évalue en le couple $(y,x)$.
  6. merge prend en argument deux couples $(a,b)$ et $(c,d)$, et s'évalue en le quadruplet $(a,b,c,d)$.

À savoir : fst et snd sont déjà définies en Ocaml, avec respectivement les types 'a * 'b -> 'a et 'a * 'b -> 'b.

Listes

Définir les fonctions suivantes en OCaml. Quels sont leur types ?

  1. enumerate prend un entier $n$ en argument, et s'évalue en la liste des $n$ premiers entiers en ordre décroissant.
  2. sum prend une liste d'entiers en argument, et s'évalue en la somme de ses éléments.
  3. rev prend une liste en argument, et s'évalue en la liste ayant les mêmes éléments, mais en sens inverse.
  4. print_int_list prend une liste d'entiers en argument, et affiche à l'exécution chaque élément de cette liste, un par ligne.
  5. last prend une liste d'entiers, et s'évalue en le dernier argument. Si la liste est vide, last s'évalue en $0$.
  6. pairs prend une liste d'entiers l$= [e_1;\ldots;e_k]$, et s'évalue en la liste de couples $[(e_1,e_2);(e_2,e_3);\ldots;(e_{k-1},e_k)]$. Si $k \leq 1$, pairs l s'évalue en [].

À savoir : rev est définie dans le module (une forme de librairie en Ocaml) List, vous pouvez l'utiliser en l'appelant List.rev.