TUTORIEL OCAML



Présentation

1
Types

2
Operateurs

3
Fonctions

4
Récursivité

5
Listes

6
Enregistrement
et
Types Sommes

7
Annexes


Exercices


Corrections


ANNEXES

Cool ! Y'a quoi d'dans ?


Dans les annexes seront présentées tout un tas de choses utiles qui n'ont cependant pas pu être mentionnées avant.


Comme quoi ? Y'avait pas déjà tout ce qui faut ? On m'aurait menti ! (snif...)


Mais non sèche moi ces larmes (renifle aussi stp... merci c'est mieux là).
Le but est de vous donner des outils supplémentaires \ ! Héhé !


Haaaaa ! J'ai compris ! Cool mais y'a quoi ?


Laisse moi finir ! (et reprend un mouchoir ça coule...)

Je disais donc... heu... Je disais quoi moi déjà ? Ha oui !
Dans ces annexes il y aura ceci :
-> Une FAQ concernant la gestion des messages d'erreurs de l’interpréteur OCaml !
-> # pour le moment
-> # le reste n'est pas
-> # encore défini lol


Voilà ! En tout cas profitez bien =)



Gestion des messages d'erreurs s'affichant dans l'interpréteur

Introduction :

Bonjour, nous avons décidés d'ajouter cette rubrique à notre tutoriel afin de faciliter vos débogages de fonctions/programmes que vous créerez en Caml ! Car si ici, vous pouvez réfléchir à tête reposée et reprendre votre code dans la journée ou plus tard encore, il n'en sera pas de même pendant l'examen.

Le Caml ayant rappelons-le, qu'un seul objectif et il est pédagogique, en plus de la récursivité (qui est LA notion à entériner !).
Il sert à vous apprendre la rigueur avec sa syntaxe très stricte.
Ayez une indentation propre, aérez votre code, la relecture de celui-ci n'en sera que plus facile et surtout plus efficace !

Ce n'est qu'en suite qu'une bonne maîtrise des messages d'erreurs devient important.
Car oui :-/ les messages d'erreurs qui s'affichent dans l’interpréteur ne sont pas toujours clairs comme de l'eau de roche.
Entre la syntaxe d'OCaml, la gestion des types et l'interpréteur affichant tantôt les erreurs en français ou en anglais...
Il faut avouer que l'on peut facilement ce sentir perdu.
Voici une petite FAQ des messages d'erreurs ;-), relatant leurs significations et surtout leurs solutions.



F.A.Q. Ocaml :

Gestion de vos messages d'erreurs dans l’interpréteur OCaml.

"/!\" IMPORTANT :

Avant de chercher une réponses parmi les exemples exposés ci-dessous, veuillez d'abord relire votre code à plusieurs reprises et vérifier la syntaxe élémentaire d'OCaml, tel que les :

Ai-je bien mis les ';;' de chaque instruction ?
Ai-je fait une faute de frappe dans le nom d'une fonction ?
Ai-je glissé un accent ou une ponctuation non-autorisé dans mon code ?

Posez vous d'abord ces quelques questions avant de vous précipiter dans les exemples qui suivent.
Merci =)

Une fois cela fait, si vous n'avez pu résoudre par vos propres moyens les erreurs qui vous ont été affichées, je vous renvoie à la listes d'erreurs ci-dessous.

Apprenez-les, mémorisez-les et tachez qu'à l'avenir celles-ci n'aient plus de raisons pour venir s'inviter dans votre programme !

Et bon débogage ;-)

Un type n'est pas compatible avec un autre type :

→ This expression has type [un type] but is here used with type [un autre type]

Exemple :

let f x = x + 2 + 2. ;; (* x + 2 (int) + 2. (float) *)
Error : This expression has type float but is used with type int #

Vos types doivent toujours concorder, sinon l'interpréteur affichera une erreur de type.
Il est impossible de faire une opération entre deux types différents !
Il faut avant cela faire une conversion, avec une fonction adaptée.
Ici dans l'exemple, on aurait :

1ère possibilité :

let f x = x + 2 + 2 ;;
(* On remplace 2. (float) par 2 (int) pour respecter la concordance *)
val f : int → int =

2nd possibilité :

let f x = x + 2 + int_of_float(2.) ;;
(* on utilise la fonction int_of_float pour que le float gênant change de type et passe en int *)
val f : int → int =

Solutions :

→ Adapter les types utilisés à l'opération voulu.

→ Utiliser une fonction de conversion de type.

ATTENTION :

Dans cet exemple, le type choisi était le type int. Cependant, si j'avais souhaité avoir le type float dans cette fonction, voici ce que j'aurais du écrire :

On passe tout en float : conversions du type int et des opérateurs :

let f x = x +. float_of_int(2) +. 2. ;;


Surtout ne pas oublier le '.' pour chaque symbole d'opération (ici ' + ' devient ' +. ') !


Un type n'est pas compatible avec lui même :

→ This expression has type [votre type] but is here used with type [votre type]

Exemple :

Error : This expression has type int but is used with type int
#

On nous harcèle le fait que nos types doivent concorder et pourtant l'interpréteur affiche une erreur !
C'est le monde à l'envers !

Ceci peut apparaître lorsque vous chargez de nombreuses fois le même fichier dans l'interpréteur, car chaque rechargement redéfinit les types.
Ceci peut ne pas paraître clair, toutefois pour parer à cette éventualité voici la démarche à suivre :

Solution :

→ Quitter l’interpréteur et recharger votre fichier dans une nouvelle session.

Stack Overflow => la fameuse boucle infinie :

-> Stack overflow during evaluation (looping recursion?).

Autrement dit vous obtenez une boucle infinie !
L'ordinateur ne sait pas quand il doit s'arrêter !

Exemple :
On souhaite une fonction qui calcule la somme des entiers naturels de 1 à x :

let rec f x = if x = x + f(x-1) ;; (* Cette fonction n'est pas valide ! *)

# let rec f x = x + f(x-1) ;;
val f : int -> int =
# f 10 ;;
Stack overflow during evaluation (looping recursion?).
#

Ici, la condition d’arrêt a été oubliée, le code correct est :
 -> let rec f x = if x = 0 then 0 else x + f(x-1) ;;

# let rec f x = if x = 0 then 0 else x + f(x-1) ;;
val f : int -> int =
# f 10 ;;
- : int = 55
#

Solution : -> Toujours avoir une condition d’arrêt lorsque vous utilisez la récursivité.

"/!\" TRES IMPORTANT : "/!\"

L'interpréteur OCaml stoppe le programme et affiche l'erreur !
Cependant d'autre langages eux, continuent à faire tourner le programme dans la boucle infinie et ceci peut endommager votre système si celle-ci reste active trop longtemps !

Les données crées à l'infini vont effectuer un dépassement de mémoire et risque d'être 'sauvegardées' par dessus des données plus importantes, comme par exemple les données gérant le système d'exploitation de votre ordinateur !

Vérifier toujours que votre condition d’arrêt est bien présente dans votre fonction ;-)


Unbound constructor => Constructeur Inconnu :

-> Error: Unbound constructor [un constructeur]

Exemple :

let f x = if x = 0 then O else x ;;
Error: Unbound constructor O

Ici l'erreur est due à une faute de frappe.
L'utilisateur a écrit 'O' (o majuscule) au lieu de '0' (zéro) !

Solution :

-> Faire attention aux fautes de frappes !

Bha oui y'a pas de secret des fois ;-)

Ce post venant d'être créé il n'est pas encore très riche en contenu, cependant il sera mis à jour régulièrement afin d'expliquer un maximum d'erreurs pouvant vous arriver.
Merci de votre soutien et n'hésitez pas à partager ce site =)