Caml : sous-tiret et déclaration ?
Résolu
Erdouh
Messages postés
7
Statut
Membre
-
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.
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
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 :
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.
Du coup, mettre _ tout seul dans un let ne sert à rien.
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...
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. ^^
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. ^^
Si on pourrait faire autrement, en encadrant tes instructions par begin/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 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 !