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.

Il est impossible d'effectuer quelque opération mathématique connue sur les booléen. En revanche il existe des opérateurs logiques. Comme dans tous les langages vous trouverez le et logique (&&), 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.
ABA && BA || Bnot (A)
falseflasefalsefalsetrue
falsetruefalsetruetrue
trueflasefalsetruefalse
truetruetruetruefalse
# 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.

FonctionEntréeSortieBut
int_of_charcharintRenvoie le code ASCII du caractère
int_of_floatfloatintConverti le nombre réel en entier (troncature)
int_of_stringstringintObtient la valeur de l'entier représenté dans la chaîne lorsque c'est possible
float_of_intintfloatConverti le nombre entier en valeur réelle
float_of_stringstringfloatObtient la valeur du réel représenté dans la chaîne lorsque c'est possible
char_of_intintcharRenvoie le caractère associé à ce code ASCII
char_for_readstringcharTransforme le caractère en chaîne de caractère (string)
string_of_boolboolstringReprésente la valeur du booléen sous forme de chaîne de caractères
string_of_intintstringConverti l'entier en chaîne de caractères
string_of_floatfloatstringConverti 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.

Outils personels