Caml : sous-tiret et déclaration ?

Résolu
Erdouh Messages postés 7 Statut Membre -  
Erdouh Messages postés 7 Statut Membre -
Bonjour,

J'ai commencé le Ocaml récemment ; et j'ai un peu de mal à comprendre l'usage du sous-tiret _ dans le cas d'une déclaration de variables.

Ex : typiquement, on utilise souvent let _ = [...] in [...]

Dans ce genre de cas, je ne comprends pas à quoi ça sert d'utiliser ce _. Si quelqu'un peut m'expliquer avec un exemple, ce serait sympa. :)
J'utilise habituellement seulement des lettres comme variable, par exemple : [...] let a = 5 in f a

Merci d'avance.


2 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Je n'avais jamais vu de _ tout seul sur un let, pour moi ça a peu de sens car tu ne peux pas utiliser _ pour contenir une variable.

Un cas d'utilisation de _ est pour un match dans ce cas il représente n'importe quelle valeur dont on ne servira pas.

Par exemple si je veux le premier élément d'une liste :

match liste with
x::_ -> x
| _ -> raise (Invalid_argument "liste vide")

Ici j'utilise _ deux fois, dans un premier temps pour dire que la liste commence par x suivi de quelque chose (on ne sait pas quoi, ça existe, mais on se fiche de sa valeur), et dans un deuxième temps pour prendre en compte tous les autres cas possible.

Mais avec un let, le seul intérêt ce serait si le _ est associé avec une autre valeur.

let (x,_) = (1,2);;
Dans ce cas on a un couple (1,2), on veut récupérer 1 dans x, mais on ne veut pas récupérer 2. Donc on met _

Du coup, mettre _ tout seul dans un let ne sert à rien.
let _ = 5;;
signifie qu'il y a 5 et que je ne veux pas le récupérer, du coup ça ne sert à rien de faire un let...
1
Erdouh Messages postés 7 Statut Membre
 
Merci pour cette réponse ; ça m'a aiguillé vers l'explication que je recherchais. :')

J'avais des exemples du type :
let rec print_prefix t = if (est_feuille(t)) then print_int(contenu_noeud t) else let _ = print_int(contenu_noeud t) in let _ = print_prefix(sous_arbre_gauche(t)) in print_prefix(sous_arbre_droit(t));;

ou encore

let _ = for i=0 to 10 do begin let [...] end done

C'est juste une astuce qui permet d'exécuter une ou plusieurs commandes les unes à la suite des autres ; il me semble qu'on ne peut pas faire autrement en Caml. ^^
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Si on pourrait faire autrement, en encadrant tes instructions par begin/end.

let rec print_prefix t =
if (est_feuille(t))
then print_int(contenu_noeud t)
else begin
print_int(contenu_noeud t);
print_prefix(sous_arbre_gauche(t));
print_prefix(sous_arbre_droit(t));
end;;

De manière générale, si tu es amené à penser que "on ne peut pas faire autrement" c'est que tu ne connais pas la bonne manière de faire, mais ça ne veut pas dire qu'elle n'existe pas.

Pour
let _ = 
en tout cas, si tu le mets, c'est forcément pour une mauvaise raison !
0
Erdouh Messages postés 7 Statut Membre
 
Ah oui, effectivement, c'est plus clair de le faire comme ça.
Merci. :)
0