Pages : 1
#1 Le 01/01/2007, à 12:50
- reaver
Caml et ses délimiteurs
Bonjour,
je suis encore débutant en caml, donc je n'y comprend pas grand chose...
Je suis tombé sur un programme sur lequel je me pose plusieurs question. Voici deux versions d'un même programme
1re version :
let jui () =
let s = "britannique" in
let s ="chinoise" in
print_string "hong konk est une ville";
print_string s;
print_string "sous souveraineté";
print_string s;;
2 e version
let jui () =
let s = "britannique" in
begin
let s ="chinoise" in
print_string "hong konk est une ville";
print_string s;
end
print_string "sous souveraineté";
print_string s;;
j'ai en fait trois questions :
1. En fait j'ai essayé les deux programmes ci-dessus, ils marchent bien. Donc quelle est l'utilité des délimiteurs begin end?
2. J'ai remarqué qu'en retirant les () qui viennent après "jui" le programme ne m'affiche que " unit = ()". A quoi servent-ils?
3. Finalement, on attribu à la variable s deux choses différentes, à savoir au début "britannique", et après "chinoise". Comment est ce possible?
Voilà donc ce sur quoi je bloque. Je vous prie de m'aider.
Merci d'avance
Hors ligne
#2 Le 01/01/2007, à 15:51
- Freddy
Re : Caml et ses délimiteurs
Si tu écris « let jui = expression;; », tu définis une variable nommée jui, dont le type est celui de l'expression (qui se trouve être ici unit).
Si tu écris « let jui () = expression », tu définis une fonction de type unit -> (le type de expression, dans notre cas unit). Ici, () est l'argument de la fonction.
En fait j'ai essayé les deux programmes ci-dessus, ils marchent bien. Donc quelle est l'utilité des délimiteurs begin end?
Normalement, avec le premier, tu as dû obtenir lors que l'appel jui () :
Honk-Kong est une villechinoisesous souverainetéchinoise - : unit = ()
Alors que le deuxième produit :
honk-kong est une villechinoisesous souverainetébrintannique - : unit = ()
Donc les deux fonctions sont différentes.
Les délimiteurs begin et end servent à définir la portée des séquences. Si on réécrit légèrement le deuxième programme (renommage de la deuxième variable) :
let jui () =
let s = "britannique" in
begin
let t ="chinoise" in
print_string "hong konk est une ville";
print_string t;
end
print_string "sous souveraineté";
print_string s;;
Il est évident que t n'aura aucune existence en dehors de la séquence délimitée par begin ... end. Dans ton deuxième programme, s pointe vers l'objet "chinoise" à l'intérieur de la séquence délimitée par begin ... end, mais une fois sorti de cette séquence, on retrouve l'envirronement précédent, dans lequel s pointe vers l'objet "britannique".
Si tu as installé le paquet « ocaml-book-fr » (dans les dépôts multiverse je crois), tu peux regarder file:///usr/share/doc/ocaml-book/fr/html/book-ora028.html#toc39
Le livre décrit plus spécialement OCaml, mais la plus grande partie du livre s'applique sans modification à CamlLight.
There is no system but GNU, and Linux is one of its kernels.
Hors ligne
#3 Le 02/01/2007, à 12:07
- reaver
Re : Caml et ses délimiteurs
En fait j'ai mal compris le début où tu me parlais de
Si tu écris « let jui = expression;; », tu définis une variable nommée jui, dont le type est celui de l'expression (qui se trouve être ici unit).
Si tu écris « let jui () = expression », tu définis une fonction de type unit -> (le type de expression, dans notre cas unit). Ici, () est l'argument de la fonction.
ca veut dire quoi "dont le type est celui de l'expression" et aussi "une fonction de type unit" ?
Hors ligne
#4 Le 02/01/2007, à 16:13
- Freddy
Re : Caml et ses délimiteurs
En Caml, chaque objet à un type. Il y a les entiers (appelés par le compilateur ou par l'interpréteur « int »), les nombres décimaux (ou « float »), les booléens (appelés « bool », qui peuvent prendre pour valeurs true ou false), etc. Les fonctions sont des objets comme les autres, leurs type est noté 'a -> 'b, où 'a désigne le type de l'argument et 'b le type du résultat. Par exemple, la fonction int_of_float (qui renvoie la partie entière d'un flottant) est de type float -> int.
Il est très important de savoir quel est le type des objets qu'on manipule, en Caml.
« let jui () = expression » est une fonction de type unit -> 'a, où 'a désigne le type de « expression », c'est à dire qu'une fois appliquée à un objet de type unit, cette fonction renverra un objet de type 'a.
Le premier code (qui commence par « let jui = »)est celui de la définition d'un objet qui se nomme jui qui est de type unit. Le deuxième (qui commence par « let jui () = » est le code d'une fonction de type unit -> unit.
There is no system but GNU, and Linux is one of its kernels.
Hors ligne
Pages : 1