Prepa Help
Prepa Help › Cours › Informatique (MP2I), 1re année

Langage OCaml en MP2I : cours, méthodes et exercices corrigés

Expressions et types d'OCaml, liaisons let, fonctions et application partielle, types somme et produit, filtrage, listes et récursivité ; traits impératifs : séquence, références, boucles, tableaux, enregistrements mutables, exceptions ; premiers programmes complets en OCaml.

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

OCaml est le langage fonctionnel de l'option informatique : on y décrit des valeurs et des fonctions plutôt que des suites d'instructions, et OCaml vérifie les types avant toute exécution, sans jamais convertir seul un entier en flottant (typage statique et fort). En MP2I, il faut savoir prévoir le type d'une expression, écrire des fonctions avec let et let rec, appliquer une fonction partiellement, parcourir une liste par filtrage avec match en couvrant tous les cas, puis passer au style impératif avec des références, des boucles et des tableaux. Le chapitre couvre l'annexe B.1 du programme et la partie de B.2 utile au premier semestre ; il ne suppose aucune connaissance d'OCaml. Les sujets de CCINP, de Mines-Ponts, de Centrale-Supélec et de X-ENS posent des questions de ce niveau, reprises dans les exercices. Tu y trouves un cours d'OCaml pas à pas, la récursivité sur les listes, le coût des opérations, et des exercices OCaml corrigés avec les réponses de la boucle interactive.

Ce que tu sauras faire

OCaml est le langage fonctionnel du programme : on y décrit des valeurs et des fonctions plutôt que des suites d'instructions, et le compilateur vérifie les types avant toute exécution. Ce chapitre présente tout le langage de l'annexe B.1 du programme et la partie de B.2 utile au premier semestre, dans l'ordre où l'on s'en sert ; les piles, files, tables de hachage, fichiers et fils d'exécution de B.2 viennent avec les chapitres qui les étudient. À la fin, tu dois savoir :

L'essentiel : Expressions et types Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

À retenir Le principe

Tout est expression : une valeur et un type, connus avant l'exécution (typage statique). Aucune conversion implicite (typage fort). La boucle interactive répond - : int = 7 pour une expression, val x : int = 7 pour une déclaration.

type valeurs opérateurs
int 7, -3, max_int + - * / mod ; / tronque vers zéro
float 2., 3.14, 1e-3 +. -. *. /. ; ** (B.2)
bool true, false not, &&, || (paresseux)
char 'a' comparaisons
string "abc" ^, s.[i], String.length ; immuable
unit () valeur des actions
  • Comparaisons = <> < > <= >= entre deux valeurs du même type ; pas de == (égalité physique, hors annexe). Sur un type somme, la comparaison polymorphe range les constructeurs sans argument avant ceux avec argument : on écrit sa propre comparaison.
  • (-7) / 2 vaut −3-3, (-7) mod 2 vaut −1-1 ; max_int + 1 = min_int, sans erreur.
  • Conversions (B.2) : float_of_int, int_of_float (tronque), string_of_int.
  • Flottants comparés avec une tolérance : x -. y < eps && y -. x < eps.

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 18 méthodes, 25 pièges corrigés, la carte mentale, 33 exercices corrigés, 4 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Ce chapitre est offert : il s’ouvre en entier avec un compte d’essai gratuit.

Ouvrir l'essai gratuit

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Prévoir le type et la valeur d'une expression
  2. Lire un message d'OCaml et corriger le code
  3. Calculer sans mélanger entiers et flottants
  4. Écrire une fonction récursive sur un entier
  5. Utiliser une fonction d'ordre supérieur et l'application partielle
  6. Écrire une fonction récursive sur une liste par filtrage
  7. Rendre un filtrage exhaustif et ordonner les motifs
  8. Comparer à une valeur dans un filtrage
  9. Construire une liste résultat
  10. Utiliser un accumulateur quand il change le coût
  11. Renvoyer plusieurs résultats
  12. Déclarer un type somme et écrire les fonctions qui le filtrent
  13. Utiliser 'a option pour un résultat qui peut manquer
  14. Parcourir un tableau avec une boucle, et s'arrêter tôt
  15. Créer une matrice sans alias et copier un tableau
  16. Lever, rattraper et utiliser une exception
  17. Choisir entre liste et tableau, fonctionnel et impératif
  18. Écrire du code OCaml sur la copie

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (13)

Entraînement (15)

Approfondissement (5)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Quelle différence entre = et == en OCaml ?

= est l'égalité structurelle : elle compare deux valeurs du même type, composante par composante pour les listes et les n-uplets, et [1; 2] = [1; 2] vaut true. == est l'égalité physique : elle teste si les deux valeurs sont le même objet en mémoire, et [1; 2] == [1; 2] vaut false, car les deux listes sont construites séparément. == n'est pas dans l'annexe du programme : on compare toujours avec = et <>. Venant de Python, == s'écrit = et != s'écrit <>.

Pourquoi 1 + 2.5 est refusé en OCaml ?

+ additionne deux entiers, et 2.5 est un flottant : OCaml ne convertit jamais seul, et répond The constant "2.5" has type "float" but an expression was expected of type "int". Les flottants ont leurs opérateurs pointés, +., -., *., /., et des constantes du même type : 1. +. 2.5 vaut 3.5. Un entier se convertit par float_of_int : float_of_int total /. float_of_int n donne une moyenne avec ses décimales, alors que total / n tronque. ** ne s'applique qu'aux flottants, et le reste s'écrit mod.

Comment écrire une fonction récursive sur une liste en OCaml ?

On déclare la fonction avec let rec, puis on filtre les deux formes d'une liste, [] et x :: reste : let rec longueur l = match l with | [] -> 0 | _ :: reste -> 1 + longueur reste. On écrit d'abord la réponse pour la liste vide, puis le cas x :: reste en supposant connu le résultat sur reste. Chaque appel porte sur la queue, plus courte d'un élément : on atteint la liste vide, avec un appel par élément. Sans rec, OCaml répond Unbound value, car le nom n'existe pas encore dans le corps de sa propre définition.

Que veut dire Warning 8 this pattern-matching is not exhaustive en OCaml ?

Un cas possible n'est couvert par aucun motif du match. OCaml compile quand même et donne un exemple de cas oublié, souvent [] ; si ce cas se présente, l'exécution s'arrête sur l'exception Match_failure. Tout filtrage doit être exhaustif : un cas que la spécification interdit se traite quand même, par exemple | [] -> failwith "tete : liste vide". Les motifs sont essayés dans l'ordre, du plus particulier au plus général : [x] avant _ :: reste, sinon l'avertissement 11 signale une branche jamais utilisée.

Qu'est-ce que la curryfication et l'application partielle en OCaml ?

Une fonction à deux arguments s'écrit avec deux paramètres séparés par des espaces : let prix_caisse prix_kg poids_g = prix_kg * poids_g / 1000 a le type int -> int -> int, qui se lit int -> (int -> int). Elle reçoit un entier et renvoie une fonction qui attend le second : on dit qu'elle est curryfiée. prix_caisse 90 est donc une application partielle, de type int -> int, et List.map (prix_caisse 90) [12500; 9750] vaut [1125; 877]. Une virgule fabrique un n-uplet : on écrit min 3 5, et non min (3, 5).

Quelle différence entre une liste et un tableau en OCaml ?

Une liste ([1; 2; 3], de type 'a list) est immuable : x :: l construit une nouvelle liste en temps constant, et on la parcourt par filtrage ; atteindre le ii-ième élément demande de parcourir ii maillons. Un tableau ([|1; 2; 3|], de type 'a array) est mutable et de taille fixe : on lit t.(i) et on écrit t.(i) <- v en temps constant, et on le parcourt avec une boucle for. Construction et parcours de bout en bout : une liste ; beaucoup d'accès par indice ou de modifications : un tableau. La consigne du sujet passe avant : style imposé, fonctions interdites.

Comment y accéder

Ce chapitre fait partie des chapitres offerts : il s'ouvre en entier avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet, les tarifs ou une question, écris-nous sur WhatsApp.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France.

Essayer gratuitement Prepa Help