Types de base
Un article de Mangue.org, l'encyclopéde libre.
Ce cours est consacré aux types de base du langage. Vous apprendrez comment utiliser les opérateurs et les principales fonctions associées. Dans une seconde partie du cours nous présenterons les principales fonctions de transtypage.
| Sommaire |
Les entiers : int
En Caml les entiers sont codés sur 31 bits, ce qui implique que vous pourrez représenter tous les nombres compris entre -230 et +230-1
Vous vous en doutez il est possible d'utiliser les opérateurs arithmétiques de base avec les entiers, à savoir + - * / et mod ainsi que les opérateurs de comparaison qui produiront un résultat booléen comme dans les exemples suivants :
# 2 + 3 ;; - : int = 5 # -5 - 1 ;; - : int = -6 # 28 mod 3 ;; (* reste de la division entière *) - : int = 1 # 21 / 4 (* produit un résultat entier *) ;; - : int = 5 # 3 < 1 ;; - : bool = false # 3 + 2 <> 6 ;; - : bool = true
Voilà je pense qu'il n'y a pas grand chose à ajouter. Nous verrons plus bas dans ce cours quelles sont les fonctions de transtypage associées aux entiers.
Les réels : float
En Caml les nombres réels doivent toujours comporter un séparateur décimal, sauf si ils sont écrits sous forme exponentielle dans quel cas ce n'est pas indispensable.
Vous pouvez utiliser les différents opérateurs +. -. *. /. ** agissant sur les entiers, ** représentate l'élévation à une puissance réelle. Les opérateurs de comparaisons peuvent être écrits avec ou sans les .
# 1.0 +. 3.5 ;; - : float = 4.5 # 4.0 ** 2. ;; - : float = 16.0 # 6.0 *. 0.4 <. 3.0 ;; - : bool = true # 3.051 + 53.1 (* mauvais opérateur *) ;; Toplevel input: > 3.051 + 53.1 (* mauvais opérateur *) ;; > ^^^^^ This expression has type float, but is used with type int. # 0.25 +. 2 (* la seconde opérande est mauvaise *) ;; Toplevel input: > 0.25 +. 2 (* la seconde opérande est mauvaise *) ;; > ^ This expression has type int, but is used with type float. # 1e-6 ;; - : float = 1e-006 # 2e-3 =. 0.002 ;; - : bool = true # 13E9 =. 1.3e10 ;; - : bool = true # 13e9 /. 3.56 (* e et E sont tous les deux utilisables *) ;; - : float = 3651685393.26 # 14.25e13 /. 10e12 ;; - : float = 14.25
Vous voyez ici à quel point le langage Caml est typé. Il est cependant possible d'additionner des nombres entiers et des nombres réels rassurez vous, mais nous ne verrons ça qu'avec les fonctions de transtypage en contrebas.
| Astuce |
| Prenez dès maintenant les bonnes habitudes ! Ecrivez toujours la partie entière et la partie décimale de vos nombres même si elle n'est pas nécessaire. La lisibilité de vos codes sources n'en sera que simplifiée. |
Les booléens : bool
Si vous avez déjà programmé dans un autre langage vous savez très bien à quel point les booléens deviennent utiles. Mais pour les autres nous allons faire un rappel ;)
Les booléens sont en fait un type particulier de données qui ne peuvent prendre que deux valeurs, vrai ou true et faux ou false. Ils servent essentiellement pour les traitements conditionnels au sein des programmes comme nous le verrons rapidement.
&&), le ou logique (||) et le non logique (not) mais il n'existe pas de ou exclusif comme dans certains langages. Si vous en avez besoin vous apprendrez comment écrire vos propres fonctions dès le cours suivant.| A | B | A && B | A || B | not (A) |
|---|---|---|---|---|
| false | flase | false | false | true |
| false | true | false | true | true |
| true | flase | false | true | false |
| true | true | true | true | false |
# false ;; - : bool = false # False (* attention, CAML fait la différence entre minuscules et majuscules *) ;; Toplevel input: > False (* attention, CAML fait la différence entre minuscules et majuscules *) ;; > ^^^^^ The value identifier False is unbound. # true || false ;; - : bool = true # false (* 0 *) < true (* 1 *) ;; - : bool = true # (4 = 3) || ( true && (6-9<1)) ;; - : bool = true
Les expressions faisant intervenir des opérateurs booléens sont évaluées de manière optimale. Prenons l'exemple d'un ou logique, A || B, si A est vrai alors B ne sera pas évalué puisque le résultat est déjà connu. De même pour un et logique, A && B, si A est faux alors le résultat est connu d'avance et l'évaluation de B n'aura pas lieu.
| Remarque | |
Si les opérateurs && et | vous dérangent, vous pouvez les remplacer respectivement par & et or.
|
Les caractères : char
En Caml les caractères sont délimités par ` `, soit les caractères accessibles par une pression sur [Alt Gr] + 7 sur un clavier français.
Vous pouvez bien évidemment utiliser les opérateurs de comparaison sur les caractères comme sur les entiers.
Il n'y a rien à ajouter, en effet vous ne pourrez pas les manipuler davantage sans l'utilisation des fonctions de transtypage ;)
Les chaînes de caractères : string
En Caml les chaînes de caractères sont délimitées par " ". On peut invoquer les opérateurs de comparaison sur les chaînes de caractères. Ceux-cis comparent un à un tous les caractères de la chaîne. Dès que l'un d'eux est différent ou que l'une des deux chaînes ne possède plus de caractères le résultat est connu.
Il est également possible de concaténer deux chaînes de caractères, c'est à dire de les mettre bout à bout. Pour celà il suffit d'invoquer l'opérateur ^ comme dans les exemples suivants.
Vous pouvez aussi indexer les caractères d'une chaîne de caractères en utilisant la notation s.[i] pour l'afficher ou même pour le modifier directement en utilisant l'opérateur <- que nous verrons plus en détails dans les cours suivants, notemment avec les structures de données.
# "ceci est une chaîne de caractères" ;; - : string = "ceci est une chaîne de caractères" # "ça aussi, c'est une chaîne :]" ;; - : string = "ça aussi, c'est une chaîne :]" # "papa" > "maman" (* ??? *) ;; - : bool = false # "premier bout " ^ "le reste..." ;; - : string = "premier bout le reste..." # "voyons, si je met 9 après: " ^ `9` (* `9` est un caractère !!! *);; Toplevel input: > "voyons, si je met 9 après: " ^ `9` > ^^^ This expression has type char, but is used with type string. # let s = "chaîne de caractères assez longue !" ;; s : string = "chaîne de caractères assez longue !" # s.[0] ;; - : char = `c` # s.[7] ;; - : char = `d` # s.[(string_length(s)-1)] ;; - : char = `!` # s.[0] <- `C` ;; - : unit = () # s ;; - : string = "Chaîne de caractères assez longue !"
Le type unit
C'est un type assez particulier dans le sens où son évaluation ne retourne rien ! Il est utilisé uniquement en entrée ou en sortie de certaines fonctions. Son principal intérêt est de provoquer des effets de bord comme nous le verrons par la suite.
Ce concept est indissociable de la programmation impérative, c'est pourquoi nous ne le détaillerons pas plus pour l'instant. Tout ce que vous devez savoir est que le type unit ne contient qu'une seule valeur : ()
Le transtypage
Nous allons maintenant voir les principales fonctions permettant de passer d'un type de données à un autre. Elles sont présentées au sein d'un tableau et des exemples suivent. Si vous ne comprenez pas, comme toujours le forum est là pour vos questions.
| Fonction | Entrée | Sortie | But |
|---|---|---|---|
int_of_char | char | int | Renvoie le code ASCII du caractère |
int_of_float | float | int | Converti le nombre réel en entier (troncature) |
int_of_string | string | int | Obtient la valeur de l'entier représenté dans la chaîne lorsque c'est possible |
float_of_int | int | float | Converti le nombre entier en valeur réelle |
float_of_string | string | float | Obtient la valeur du réel représenté dans la chaîne lorsque c'est possible |
char_of_int | int | char | Renvoie le caractère associé à ce code ASCII |
char_for_read | string | char | Transforme le caractère en chaîne de caractère (string) |
string_of_bool | bool | string | Représente la valeur du booléen sous forme de chaîne de caractères |
string_of_int | int | string | Converti l'entier en chaîne de caractères |
string_of_float | float | string | Converti le nombre réel en chaîne de caractères |
# let entier = 63 and réel = 27.81 and booléen = true and caract = char_of_int(65) and chaîne = "Bgw" and bizzare = () ;; entier : int = 63 réel : float = 27.81 booléen : bool = true caract : char = `A` chaîne : string = "Bgw" bizzare : unit = () # int_of_float(réel) + entier + 10 ;; - : int = 100 # string_of_bool(booléen) ^ " " ^ chaîne ;; - : string = "true Bgw" # char_of_int(int_of_char(chaîne.[0]) - 32) ;; - : char = `"` # chaîne.[1] <- `G`; chaîne.[2] <- `W`; chaîne ;; - : string = "BGW"
Vous devriez vous y retrouver sans trop de problèmes, sauf pour le dernier exemple que je vous accorde. Nous verrons plus loin comment utiliser le type unit et à quoi sert le ;
Notez simplement qu'il est possible d'enchaîner des instructions dans ce que nous appellerons une séquence sans problèmes lorsque ces différentes instructions renvoient un résultat de type unit. Si nous faisions la même chose avec des instructions renvoyant des valeurs de type int, string ou autres le compilateur nous mettrait en garde.
# bizzare ;; - : unit = () # bizzare; chaîne ;; - : string = "BGW" # chaîne.[1] <- `g`; chaîne ; chaîne.[2] <- `w` ;; Toplevel input: > chaîne ; > ^^^^^^ Warning: this expression has type string, but is used with type unit. - : unit = ()
Les séquences permettent d'enchaîner des expressions de type unit unqiuement. Nous verrons tout ça dans les cours sur la programmation impérative rassurez vous, ça n'a aucun intérêt ou presque pour l'instant mais vous ne pourrez plus vous en passer par la suite ;)
Le type unit ne sera d'ailleurs pas réutilisé (sauf en retour de certaines fonctions) avant les cours traitant de programmation impérative alors ne perdez pas trop de temps à ce sujet pour l'instant. Si vous voulez absolument en savoir plus posez donc vos questiosn sur le forum.
D'autres fonctions
Il existe bien d'autres fonctions et opérateurs que vous pouvez utiliser sur ces types de base. Si vous voulez absolument en faire la liste lisez l'aide de votre compilateur vous y trouverez des renseignements très utiles.
Ne m'en veuillez pas trop... Mais il existe même d'autres types de données déjà connus par le Caml comme le type num par exemple qui vous permettra d'accomplir de grands prodiges. Encore uen fois l'aide est là pour vous mais comme celle-ci est en anglais je pourrais vous aider davantage sur le forum si vous en avez besoin.

