TP n o 3 : Types sommes en CAML

Documents pareils
Recherche dans un tableau

Classes et Objets en Ocaml.

modules & compilation

Algorithmique et Programmation, IMA

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

TP 1. Prise en main du langage Python

Cours de Programmation 2

Vérification de programmes et de preuves Première partie. décrire des algorithmes

TP3 : Manipulation et implantation de systèmes de fichiers 1

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Présentation du langage et premières fonctions

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Conventions d écriture et outils de mise au point

TP : Gestion d une image au format PGM

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Introduction à l algorithmique et à la programmation M1102 CM n 3

Probabilités. I Petits rappels sur le vocabulaire des ensembles 2 I.1 Définitions... 2 I.2 Propriétés... 2

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TP1 : Initiation à Java et Eclipse

Programme Compte bancaire (code)

Les chaînes de caractères

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Cours 1: Java et les objets

Table des matières. Introduction

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TD3: tableaux avancées, première classe et chaînes

Quelques éléments de compilation en C et makefiles

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Olivier Mondet

Initiation à la Programmation en Logique avec SISCtus Prolog

UE Programmation Impérative Licence 2ème Année

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Plan. École Supérieure d Économie Électronique. Plan. Chap 9: Composants et systèmes de sécurité. Rhouma Rhouma. 21 Juillet 2014

L exclusion mutuelle distribuée

S initier aux probabilités simples «Question de chance!»

PHP. PHP et bases de données

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

OCL - Object Constraint Language


SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Bases de programmation. Cours 5. Structurer les données

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Consigne : je remplis le tableau en tenant compte des informations de la ligne supérieure et de la colonne de gauche (droite pour les gauchers)

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Le match par quatre en

Programmer en JAVA. par Tama

Rappels Entrées -Sorties

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Le langage SQL Rappels

2 Comment fonctionne un ordinateur, dans les grandes lignes

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Aide - mémoire gnuplot 4.0

Utilisation d objets : String et ArrayList

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Structurer ses données : les tableaux. Introduction à la programmation

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Méthode du commentaire de document en Histoire

Maple: premiers calculs et premières applications

Paginer les données côté serveur, mettre en cache côté client

Java Licence Professionnelle CISII,

Ni tout noir, ni tout blanc Consignes Thème I - Observer

Indications pour une progression au CM1 et au CM2

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Introduction à JDBC. Accès aux bases de données en Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Cours 1 : Qu est-ce que la programmation?

ALGORITHMIQUE ET PROGRAMMATION En C

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Cours 1 : La compilation

Chap III : Les tableaux

MANUEL UTILISATEUR : RECETTES TABLE DES MATIERES PIE : PRESTATIONS INTERNES ET EXTERNES

Faites connaissance avec votre Rubik s Cube Étape 1

Langage SQL : créer et interroger une base

De la tablette d'argile à la tablette tactile

EXCEL TUTORIEL 2012/2013

Exercices de dénombrement

Chapitre 10. Les interfaces Comparable et Comparator 1

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

Calc 2 Avancé. OpenOffice.org. Guide de formation avec exercices et cas pratiques. Philippe Moreau

Plan du cours. Historique du langage Nouveautés de Java 7

TP, première séquence d exercices.

3 Octobre Les Communautés MS

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Une introduction rapide à Coq

Dossier exclusif : le grand test de la NB4 LE GRAND TEST DE LA NEUF BOX 4

Notions fondamentales du langage C# Version 1.0

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Transcription:

TP n o 3 : Types sommes en CAML Nous avons rencontré les types de base en CAML : bool, int, float, char, string et des opérations algébriques sur les types (int -> float, (string * char * bool), etc). En CAML, on a également la possibilité de définir nos propres types personnalisés. 1 Types sommes Imaginons par exemple que nous souhaitions ajouter aux booléens vrai et faux une valeur qui permette de représenter l indécision. On peut alors définir un type : type trileen = Vrai Faux PeutEtre La phrase type nom_du_type =... permet de définir un nouveau type. Le caractère se lit «ou 1». Les constructeurs Vrai, Faux et PeutEtre sont alors définis et sont les (seules) valeurs possibles du type trileen. Vrai - : trileen = Vrai PeutEtre - : trileen = PeutEtre Faux = PeutEtre - : bool = false (* Booléen standard! *) On appelle un type défini de cette manière un type somme. Intuitivement on réalise effectivement une «somme» ou une union de constructeurs simples. " Les noms de constructeurs commencent par une majuscule. Par convention, à respecter absolument, les noms de variables ou de fonctions ne doivent donc jamais commencer par une majuscule. Pour utiliser les types sommes, et pour bien d autres choses comme nous le verrons prochainement, on dispose en CAML d un outil très puissant : le filtrage de motifs. Définition 1.1 Le filtrage est une expression dont la syntaxe est : 1. À ne pas confondre avec le «ou logique» qui s écrit. http://cpge.info 1

match expr0 with motif1 -> expr1 motif2 -> expr2... Toutes les expressions expr1, expr2,... doivent être de même type, qui est alors le type de cette expression. 1. Comparaison de la valeur de expr0 avec les motifs ; 2. Dans l ordre et on prend le premier qui correspond ; 3. Le filtrage doit être exhaustif (un des motifs doit correspondre). Par exemple, si prop est de type trileen, on réalise un filtrage pour agir selon les cas : (* Réalise le "non" en logique triléenne *) let non_trileen prop = match prop with Vrai -> Faux PeutEtre -> PeutEtre Faux -> Vrai non_trileen : trileen -> trileen = <fun> let prop = Vrai prop : trileen = Vrai non_trileen prop - : trileen = Faux CAML détecte automatiquement que tous les cas ont bien été considérés et renvoie un message d avertissement si ce n est pas le cas : let hesiter prop = match prop with Vrai -> PeutEtre Faux -> PeutEtre Warning 8: this pattern-matching is not exhaustive. C est un trait très puissant de CAML. Ne pas avoir traité tous les cas est détecté avant même d exécuter le programme! Question 1 Imaginer ce que peut être un «et» en logique triléenne et écrire une fonction et_trileen : trileen -> trileen -> trileen qui le réalise. 2 Constructeurs avec paramètres Jusqu ici les trois constructeurs étaient des constantes. On peut également définir des constructeurs paramétrés qui dépendent d un autre type avec la syntaxe NomConstructeur of un_type. Par exemple, http://cpge.info 2

on peut définir un jeu de cartes avec : type couleur = Pique Coeur Carreau Trefle type carte = Joker As of couleur Roi of couleur Dame of couleur Valet of couleur Nombre of int * couleur On peut alors définir des cartes avec la syntaxe NomConstructeur (expr : un_type) : let carte1 = As Pique carte1 : carte = As Pique let carte2 = Nombre (3, Carreau) carte2 : carte = Nombre (3, Carreau) Question 2 Définir le roi de cœur, la dame de pique et le neuf de trèfle. Question 3 Prévoir et expliquer ce que renvoient les expressions suivantes : carte1 = carte2 carte2 = (3, Carreau) Pique Joker As Nombre Un constructeur est plus qu une simple fonction : on peut faire un filtrage de motif : http://cpge.info 3

let est_carreau carte = match carte with Joker -> PeutEtre As Carreau -> Vrai Roi Carreau -> Vrai Dame Carreau -> Vrai Valet Carreau -> Vrai Nombre (_, Carreau) -> Vrai _ -> Faux est_carreau : carte -> trileen = <fun> Remarque 1 On utilise la variable spéciale _ pour filtrer sur n importe quel motif : «dans tous les autres cas». C est souvent pratique, mais attention à ne surtout pas prendre la mauvaise habitude de systématiquement ajouter une clause _ ->... en fin de filtrage pour éviter les messages d avertissement lorsqu un filtrage n est pas exhaustif! Question 4 Écrire une fonction est_figure : carte -> trileen qui indique si la carte reçue en entrée est une figure ou non. On pourrait, sans difficultés mais avec beaucoup de temps, programmer le jeu de belote. Par exemple pour compter les points à la fin de la partie on peut écrire : let valeur carte atout = match carte with Joker -> failwith "Carte impossible" Nombre (n, _) when n < 7 -> failwith "Carte impossible" As _ -> 11 Nombre (10, _) -> 10 Roi _ -> 4 Dame _ -> 3 Valet color when color = atout -> 20 Valet _ -> 2 Nombre (9, color) when color = atout -> 14 Nombre _ -> 0 Question 5 À quoi peut servir le type suivant? type mixte = Reel of float Int of int http://cpge.info 4

Question 6 Définir un type reel_etendu permettant de représenter la droite numérique achevée R = R {, + } et une fonction float -> reel_etendu qui permet de plonger R dans R. 3 Types récursifs Il est possible de définir des types récursifs, c est-à-dire dont leur définition fait appel à eux-même. Par exemple, on peut définir les couleurs par synthèse soustractive : type coloration = Cyan Magenta Jaune Melange of coloration * coloration Question 7 Définir en CAML le rouge (mélange de magenta et de jaune) puis l orange (mélange de rouge et de jaune). Question 8 Que fait la fonction suivante? let rec cmj color = match color with Cyan -> (1., 0., 0.) Magenta -> (0., 1., 0.) Jaune -> (0., 0., 1.) Melange (color1, color2) -> let c1, m1, j1 = cmj color1 in let c2, m2, j2 = cmj color2 in ((c1 +. c2) /. 2., (m1 +. m2) /. 2., (j1 +. j2) /. 2.) 4 Listes chaînées On peut maintenant définir notre propre type CAML pour créer des listes chaînées. Une liste chaînée est soit la liste vide (Nil), soit une tête et une queue. 1 2 FIGURE 1 Une représentation possible de la liste [1; 2; 3]. La tête de la liste est 1 et la queue [2; 3]. 3 http://cpge.info 5

On peut par exemple choisir le type CAML suivant : type a liste = Nil TeteEtQueue of a * a liste On a construit ici un type paramétré qui dépend d un type a. Question 9 Définir avec ce type la liste [1; 2; 3], représentée sur la figure 1. On peut alors écrire une fonction cons : a -> a liste -> a liste qui ajoute un élément en tête de liste : let cons tete queue = TeteEtQueue (tete, queue) Question 10 Ajouter 0 en tête de la liste précédente. Question 11 Écrire les fonctions tete : a liste -> a et queue : a liste -> a liste qui renvoient la tête et la queue d une liste si possible et un message d erreur sinon (ce que l on peut obtenir à l aide de failwith "Message"). Question 12 Écrire la fonction taille : a liste -> int qui renvoie la longueur d une liste. Question 13 Écrire une fonction appartient : a -> a liste -> bool qui vérifie si un élément appartient à une liste. Question 14 Écrire une fonction supprime : a -> a liste -> a liste qui renvoie une liste identique à celle passée en argument à ceci près que toutes les occurrences éventuelles de l élément passé en argument ont été supprimées. http://cpge.info 6