TD de programmation fonctionnelle (ocaml) - Antoine Frénoy - 2011/2012
Sommaire
Séances de Travaux Dirigés
TD 1 - 7 février 2012
L'énoncé du TD est disponible ici : TD1.pdf. Une proposition de corrigé : TD1.ml.
TD 2 - 14 février 2012
L'énoncé du TD, en deux parties, est disponible ici : TD2.pdf et TP2.pdf. Une proposition de corrigé : TD2.ml et TP2.ml.
TD 3 - 21 février 2012
L'énoncé du TD, en deux parties, est disponible ici : TD3.pdf et TP3.pdf. Une proposition de corrigé : TD3.ml et TP3.ml.
TD 4 - 6 mars 2012
L'énoncé du TD, en deux parties, est disponible ici : TD4.pdf et TP4.pdf. Une proposition de corrigé : TD4.ml et TP4.ml.
TD 5 - 13 mars 2012
L'énoncé du TD, en deux parties, est disponible ici : TD5.pdf et TP5.pdf. Une proposition de corrigé : TD5.ml et TP5.ml.
TD 6 - 20 mars 2012
L'énoncé du TD, en deux parties, est disponible ici : TD6.pdf et TP6.pdf. Une proposition de corrigé : TD6.ml et TP6.ml.
TD 7 - 27 mars 2012
L'énoncé du TD, en deux parties, est disponible ici : TD7.pdf et TP7.pdf. Une proposition de corrigé : TD7.ml et TP7.ml.
TD 8 - 3 avril 2012
Révisions (récursivité et récursivité terminale) : correction des exercices des TP 6 et 7.
TD 9 - 10 avril 2012
L'énoncé du TD, en deux parties, est disponible ici : TD9.pdf et TP9.pdf. Une proposition de corrigé : TD9.ml, TD9Ex2.ml et TP9.ml.
TD 10 - 24 avril 2012
L'énoncé du TD est disponible ici : TD10.pdf. Une proposition de corrigé : TD10.ml.
TD 11 - 30 avril 2012
L'énoncé du TD, en deux parties, est disponible ici : TD11.pdf et cc4.pdf. Une proposition de corrigé : TD11.ml et cc4.ml.
TD 12 - 7 mai 2012
L'énoncé du TD est disponible ici : TD12.pdf. Une proposition de corrigé : TD12.ml.
TD 13 - 15 mai 2012
L'énoncé du TD est disponible ici : TP13.pdf. Une proposition de corrigé : TP13.ml.
Utilisation de caml
Depuis les salles informatiques de l'université (ou en ssh):
Solution basique : utilisation directe du toplevel
On peut bien sûr utiliser directement le toplevel ocaml. Il suffit d'ouvrir un terminal et de taper la commande ocaml
: On est alors dans le toplevel. Ctrl+D permet de quitter le toplevel. Ctrl+C permet d'interrompre la saisie ou l'interprétation d'une ligne.
Vous remarquerez cependant que ce mode d'édition est fort peu pratique : il est impossible de réutiliser une ligne validée, de revenir en arrière, les copier-coller sont laborieux ... Bref ce n'est pas la meilleure façon d'utiliser ocaml !
Variante : charger dans le toplevel un fichier édité par un autre programme
On peut cependant améliorer un peu : éditez un fichier appelé par exemple td1.ml avec votre éditeur de texte préféré. Rentrez vos commandes, enregistrez le fichier. Lancer alors le toplevel depuis un terminal en vous plaçant dans le dossier contenant le fichier que vous venez d'éditer (utilisez la commande cd). Dans le toplevel, tapez #use "td1.ml" ;;
. Attention, il faut taper un # en plus de celui affiché par le toplevel. Le fichier td1.ml sera alors automatiquement chargé et évalué.
On dispose ainsi d'un véritable éditeur ce qui est très appréciable pour la saisie de programmes complexes, en revanche on perd l'interactivité : la directive use
doit être saisie après chaque modification du fichier source, et on ne peut pas évaluer celui-ci pas à pas.
Solution conseillée : utilisation du mode tuareg d'emacs
Il existe une alternative supérieure à l'utilisation du toplevel : l'éditeur de texte emacs s'interface parfaitement avec ocaml grâce au mode "tuareg". Mode d'emploi :
Télechargez le fichier tuareg.tar.gz, et décompressez le à la racine de votre répertoire personnel. On peut pour cela taper dans un terminal :
cd ~ wget "http://perso.crans.org/frenoy/caml2012/tuareg.tar.gz" tar -xzvf tuareg.tar.gz rm -f tuareg.tar.gz
Le dossier tuareg
créé ne doit pas être déplacé.
Vous pouvez lire le fichier tuareg/README
et plus généralement la documentation d'emacs (man emacs
) pour une documentation très complète sur la configuration et l'utilisation d'emacs et du mode tuareg. Cependant cet éditeur est assez complexe à prendre en main, aussi je vous propose une configuration simplifiée : téléchargez le fichier emacs-conf.tar.gz et décompressez le à la racine de votre répertoire personnel. On peut pour cela taper dans un terminal :
cd ~ wget "http://perso.crans.org/frenoy/caml2012/emacs-conf.tar.gz" tar -xzvf emacs-conf.tar.gz rm -f emacs-conf.tar.gz
Le fichier .emacs
crée ne doit pas être déplacé.
Le fichier tuareg-mode.pdf contient un condensé des raccourcis claviers les plus utilisés d'emacs ainsi que de ceux spécifiques au mode tuareg.
Vous constaterez que ces raccourcis sont compliqués à retenir ! Heureusement le fichier .emacs
que vous venez d'installer dans votre dossier personnel définit des raccourcis claviers plus conventionnels :
f2 : ouvre un fichier existant ou créer un nouveau fichier (emacs demande de saisir un nom) f3 : enregistre les modifications apportées au fichier en cours d'édition Ctrl+C : copier la selection Ctrl+X : couper la selection Ctrl+V : coller la selection Ctrl+entrée (mode tuareg seulement) : évalue la ligne courante (ie envoie la ligne courante à ocaml) f5 (mode tuareg seulement) : évalue tout le fichier depuis le début Ctrl+K (mode tuareg seulement) : tue ocaml (qui pourra être relancé) Ctrl+Q (mode tuareg seulement): tue ocaml et ferme emacs
Ouvrir un fichier dont le nom finit par .ml
(soit en utilisant f2 depuis emacs, soit en lançant directement la commande emacs nom.ml
dans un terminal) active automatiquement le mode tuareg.
La première fois que les raccourcis Ctrl+entrée ou f5 seront utilisés, emacs scindera la fenêtre en deux et lancera un interpréteur caml dans la moitié basse. Validez avec entrée lorsqu'emacs vous propose de lancer ocaml.
Attention, pensez à sauvegarder très régulièrement votre travail !
Depuis son ordinateur personnel :
Sous linux (solution adaptable à Mac OS X)
Installez ocaml à l'aide de votre gestionnaire de paquets (on peut utiliser MacPorts sous Mac OS X). Suivez alors la même démarche qu'en salle informatique.
Sous windows
Une première possibilité, relativement complexe mais efficace, est d'installer ocaml et emacs en suivant la documentation de leurs sites web respectifs pour l'installation sous windows, ce qui permet alors de travailler avec les mêmes outils qu'en salle informatique (voir aussi Cygwin pour un portage des outils unix sous windows).
Une autre possibilité, plus simple, est l'utilisation des excellents outils fournis par Jean Mouric. Certains de ces outils fonctionnent aussi sous Mac OS X. Attention, veillez à bien utiliser ocaml et non pas caml light qui est une autre implémentation du language caml.
Se connecter à distance aux salles informatiques
Vous pouvez vous passez de l'installation de ocaml sur votre ordinateur personnel en vous connectant par ssh à saphyr.ens.math-info.univ-paris5.fr
.
Si vous êtes sous Linux ou Mac OS X, tapez dans un terminal :
ssh -X login@saphyr.ens.math-info.univ-paris5.fr
Où login
est votre nom d'utilisateur. Saisissez votre mot de passe quand demandé. Vous vous retrouvez alors dans un terminal à partir duquel vous pouvez utiliser ocaml, en ayant accès à tous les documents de votre dossier personnel. Notez bien que l'option -X
est nécessaire pour lancer des programmes utilisant X11, par exemple emacs en mode graphique.
Sous Windows, on peut utiliser PuTTY ou les outils cygwin.
Attention, en cas de coupure réseau vous serez déconnecté brutalement : pensez à sauvegarder très régulièrement votre travail !
Quelques conseils pratiques
- Testez toutes vos fonctions, même si ce n'est pas demandé explicitement.
- Si le nom d'une fonction est imposé par l'énoncé, respectez le.
- Indentez votre code correctement. Sous emacs en mode tuareg, la touche TAB auto-indente la ligne courante. Si vous utilisez un autre éditeur, assurez vous qu'il soit configuré pour remplacer les tabulations par des espaces.
- Commentez votre code :
(* Ceci est un commentaire *)
Rappels de cours, astuces et erreurs à éviter
- Pour définir une fonction, on peut utiliser:
- Une définition sans mot clé. Par exemple
let db x = 2*x;;
- Le mot clé
fun
. Par exemplelet db = fun x -> 2*x;;
- Le mot clé
function
. Par exemplelet db = function x -> 2*x;;
- La deuxième est équivalente à la première, avec l'avantage de permettre de définir une fonction sans la nommer. On peut par exemple écrire
Liste.map (fun x -> 2*x) [2;4;-1;7];;
- Pour définir une fonction à plusieurs arguments, on peut utiliser
fun
et pasfunction
. function
permet de faire un filtrage directement, ce que ne permet pasfun
. On peut par exemple écrirelet rec long = function |[]->0 |h::t->1+(long t);;
qui est plus simple à écrire quelet rec long l = match l with |[]->0 |h::t->1+(long t);;
- Une définition sans mot clé. Par exemple
- Condition dans un filtrage : utilisez
when
. Attention à l'exhaustivité. - Nommer dans un filtrage : utilisez
as
. =
désigne l'égalité structurelle (négation :<>
),==
désigne l'égalité physique (négation :!=
).- Les chaines de caractères (type
string
) s'écrivent entre guillemets :print_string "Bonjour !";;
. - Les caractères (type
char
) s'écrivent entre apostrophe :print_char 'e';;
^
permet de concaténer deux chaines de caractères.@
permet de concaténer deux listes.