DĂ©couverte d'OCAML

DĂ©couverte d’OCAML

Dans ce petit article, je compte vous parler d’un langage de programmation assez particulier : (O)CAML. Tout d’abord, si j’ajoute une parenthĂšse devant la premiĂšre lettre du sigle, c’est que je ne compte pas aborder toute la partie OBJET de langage, ni la partie impĂ©rative. N’espĂ©rez donc pas voir une seul structure conditionnel (if) ou itĂ©rative (while/for) dans ce texte.

Propositions : définitions et expressions :

Tout comme en mathĂ©matique chaque phrase est une proposition, en ocaml chaque “ligne” est une proposition. Elle commence avec le premier caractĂšre et se termine avec le symbole ‘;;’

Il y a deux type de propositions :

En ocaml, la syntaxe est la suivante :

L’aspect fonctionnel

Mais comment un tel langage peut-il exister, et surtout, ĂȘtre ‘utilisable’ sans pour autant faire usage des structures des langages impĂ©ratif comme le C ou le Python? (Je m’adresse bien-sur ici a ceux qui n’ont pas encore Ă©tĂ© initier aux joies des langages fonctionnel)

Tout d’abord, dĂ©finissons ce qu’est un langage fonctionnel. Par analogie Ă  un langage objet oĂč les Ă©lĂ©ments sont des objets(Dans certains cas, TOUS les Ă©lĂ©ments), dans un langage fonctionnel, les Ă©lĂ©ments sont des fonctions, au sens mathĂ©matique du terme.

Si l’on considùre la fonction suivante :

C’est la fonction qui associe à un entier son couple situer sur sa diagonal(injection diagonal)

Il est alors trÚs aisé de définir f en ocaml :

let f x = (x, x);

Cette fonction est de type int -> int * int, c’est a dire qu’elle prend un entier et retourne un couple .

On peut bien-sur dĂ©finir des fonctions de fonction. Observons la fonction “composition”(rond) : .

En OCAML, on aurais :

let o f g = f g;;
(* val o : ('a -> 'b) -> 'a -> 'b = <fun> *)

Les filtres

Je vous ai parler un peut plus tĂŽt de l’absence de structures conditionnel et itĂ©ratif, je vais ici vous exposer les solutions a votre disposition.

Commençons avec les blocs conditionnel. En OCAML, nous disposons d’une fonction-alitĂ©e trĂšs intĂ©ressante : les filtres. Si l’on considĂšre la fonction continue suivante :

On constate que l’on a bien deux condition, une premiĂšre qui regroupe les cas des x nĂ©gatif, et une deuxiĂšme qui s’intĂ©resse aux x restant. En OCAML, on dĂ©fini de la mĂȘme façon :

let f = function
  | x when x < 0 -> -2 * x
  | x when x >= 0 -> x*x
  ;;

Ou bien, en omettant la deuxiĂšme condition et en considĂ©rons que la derniĂšre condition matcheras pour “tous les cas restant”

let f = function
  | x when x < 0 -> -2 * x
  | x -> x*x
  ;;

Dans le cas oĂč l’on a pas besoin de nommer x, on peut utiliser _. Ainsi, un dernier cas _ -> smtg correspondrais un peut Ă  ‘default’ d’un switch. On pourras aussi utiliser l’instruction match {variable} with {filtre}.

La récursivité terminal

Maintenant, considĂ©rons les itĂ©rations. Nous allons utiliser la rĂ©cursivitĂ©s terminal(tail-rec pour les intimes) affin de construire une boucle. La rĂ©cursivitĂ©e terminal est une forme de rĂ©cursivitĂ© ou l’unique action qui succĂšde Ă  l’appelle a la fonction rĂ©cursive est un retour de valeur.

C’est plutĂŽt Ă©lĂ©mentaire :

let rec aff_n = function
  | n when n < 1 -> ();
  | n -> print_endline (string_of_int n);
           aff_n (n - 1);;

() reprĂ©sente le type ‘unit’, c’est a dire que notre fonction ne retourne rien, tout comme print_endl. Nous obtenons une boucle de 10 Ă  1, et nous affichons les valeurs a l’écran. Vous vous demandez alors, pourquoi de la tail rec et non une simple rĂ©cursivitĂ©s? La rĂ©ponse est que l’interprĂ©teur/compilateur optimise par une itĂ©ration, ce qui est bien plus pratique pour nos machines qui on une mĂ©moire limiter et ne peuvent supporter qu’un nombre restreins d’appelles rĂ©cursif.

Pour conclure

OCAML est un langage fonctionnel, qui bon nombre d’aspects et concepts qui sont parfois inconnus des programmeurs aillant pratiquer uniquement des langages impĂ©ratif, et constitue de par son existence une forme de culture dont il peut-ĂȘtre bon d’avoir connaissance.

Références :

Si vous ĂȘtes curieux et dĂ©sirez en savoir plus, voici quelques liens :