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
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
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
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 :
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...
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
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. ^^
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. ^^
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
1 mars 2014 à 16:16
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 !
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
1 mars 2014 à 19:06
Ah oui, effectivement, c'est plus clair de le faire comme ça.
Merci. :)
Merci. :)