Caml : sous-tiret et déclaration ?

Résolu/Fermé
Erdouh Messages postés 7 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014 - 1 mars 2014 à 15:19
Erdouh Messages postés 7 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014 - 1 mars 2014 à 19:06
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
1 mars 2014 à 15:45
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 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014
1 mars 2014 à 15:57
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
1 mars 2014 à 16:16
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 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014
1 mars 2014 à 19:06
Ah oui, effectivement, c'est plus clair de le faire comme ça.
Merci. :)
0