langage de modules

This commit is contained in:
gwen 2017-04-29 23:14:45 +02:00
parent 81545ae4d3
commit 48524d751a
3 changed files with 109 additions and 6 deletions

View File

@ -192,7 +192,7 @@ Prédicats
Définition : Une proposition dont la valeur de vérité dépend de la valeur Définition : Une proposition dont la valeur de vérité dépend de la valeur
dune ou plusieurs variables dune ou plusieurs variables
**Exemple** : “n est pair” : vrai pour n = 4 mais faux pour n = 9 **Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9
Axiome Axiome
@ -284,3 +284,9 @@ la taille des données, on sintéresse à la façon dont augment f(n) lorsque
on va montrer que f(n) n'augmente pas plus vite quune autre fonction on va montrer que f(n) n'augmente pas plus vite quune autre fonction
g(n). Du point de vue mathématique, on dit que la fonction f est dominée g(n). Du point de vue mathématique, on dit que la fonction f est dominée
asymptotiquement par la fonction g ce qui se note f = O(g) asymptotiquement par la fonction g ce qui se note f = O(g)
- Complexité temporelle : cest le nombre dop«erations effectuées par
une machine qui exécute lalgorithme.
- Complexité spatiale : cest le nombre de positions mémoire utilisées par
une machine qui exécute lalgorithme.

View File

@ -328,6 +328,27 @@ Les types produits nommés
On les appelle enregistrements, dictionnaires ou tables de hachage. On les appelle enregistrements, dictionnaires ou tables de hachage.
::
algorithme monAlgorithme
// déclaration d'un enregistrement
enregistrement Personne
chaine nom;
chaine prenom;
entier age;
réel taille;
finenregistrement
...
Personne[50] t;
début
// Initialisation
t[0].nom <- "Duchmol";
t[0].prenom <- "Robert";
t[0].age <- 24;
t[0].taille <- 1.80;
...
fin
.. code-block:: ocaml .. code-block:: ocaml
# type adresse = { rue : string ; ville : string ; cp : int};; # type adresse = { rue : string ; ville : string ; cp : int};;
@ -341,6 +362,9 @@ On les appelle enregistrements, dictionnaires ou tables de hachage.
};; };;
# let v1 = { a = 1 ; b = false ; c = 'r'};; # let v1 = { a = 1 ; b = false ; c = 'r'};;
- les sommes (constructeurs) - les sommes (constructeurs)
.. code-block:: ocaml .. code-block:: ocaml

View File

@ -167,3 +167,76 @@ Il faut définir auparavant un type spécifique appelé `date`
arguments : arguments :
d: date d: date
description: la date dont on veut calculer le lendemain description: la date dont on veut calculer le lendemain
Le langages des modules
-------------------------
.. code-block:: ocaml
module type PILE = (* signature (interface) du module *)
sig
type a t
val create : unit -> a t
val push : a -> a t -> unit
val pop : a t -> a
end
(* implémentation du module *)
module Pile : PILE = (* le module est restreint
par la signature PILE *)
struct
type a t = a list ref
let create () = ref []
let push x p = p := x::!p
let pop p = match !p with [...]
let rec print p = match p with [...]
end
- `struct .. end` introduit une collection de définitions, valeurs, types ou modules.
C'est une **structure**.
- `module Nom = struct .. end` permet de donner un nom à cette structure et
c'est ça un module. C'est une structure nommée.
- `sig ... end` introduit une signature de module : une interface pour un module.
On restreint souvent une structure par une signature pour "cacher" certaines
définitions. Une signature de module fournit une **interface** entre l'extérieur
et l'intérieur d'un module.
En dehors du module, on accède à ses composants grâce à la notation pointée
.. code-block:: ocaml
let p = Pile.create()
Pile.push 45 p
Les foncteurs
--------------
Si un langage possède un langage de modules, on peut aller plus loin : on peut
considérer un module comme étant une expression de base du langage.
- La signature d'un module peut être considérée comme le type du module
- La structure du module peut être considéré comme sa valeur
Quel est l'intérêt ? On peut alors définir des **foncteurs**.
foncteur
"fonction" d'une structure vers une autre structure.
On peut ainsi paramétrer un module par un autre module.
.. code-block:: ocaml
module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... =
struct
...
end
On applique un foncteur à des paramètres modules, pour
obtenir un nouveau module :
.. code-block:: ocaml
module M = F (Titi) (Toto)