langage de modules
This commit is contained in:
parent
81545ae4d3
commit
48524d751a
|
@ -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
|
||||||
d’une ou plusieurs variables
|
d’une 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 s’intéresse à la façon dont augment f(n) lorsque
|
||||||
on va montrer que f(n) n'augmente pas plus vite qu’une autre fonction
|
on va montrer que f(n) n'augmente pas plus vite qu’une 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 : c’est le nombre d’op«erations effectuées par
|
||||||
|
une machine qui exécute l’algorithme.
|
||||||
|
|
||||||
|
- Complexité spatiale : c’est le nombre de positions mémoire utilisées par
|
||||||
|
une machine qui exécute l’algorithme.
|
||||||
|
|
|
@ -4,15 +4,15 @@ Les structures de données
|
||||||
.. glossary::
|
.. glossary::
|
||||||
|
|
||||||
ATD
|
ATD
|
||||||
|
|
||||||
Abstract Data Type, structure de données abstraites.
|
Abstract Data Type, structure de données abstraites.
|
||||||
La représentation des données est forcément un choix.
|
La représentation des données est forcément un choix.
|
||||||
Il est impossible de rendre compte globalement d'un élément du réel,
|
Il est impossible de rendre compte globalement d'un élément du réel,
|
||||||
il faut en faire une interprétation abstraite.
|
il faut en faire une interprétation abstraite.
|
||||||
|
|
||||||
**Exemple**:
|
**Exemple**:
|
||||||
|
|
||||||
- Un être humain peut être représenté par les données présentes dans sa
|
- Un être humain peut être représenté par les données présentes dans sa
|
||||||
carte d'identité. Mais un être humain n'est pas sa carte d'identité.
|
carte d'identité. Mais un être humain n'est pas sa carte d'identité.
|
||||||
- Un être humain peut être représenté par les données présentes dans ses préférences
|
- Un être humain peut être représenté par les données présentes dans ses préférences
|
||||||
de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net.
|
de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net.
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue