Caml : sous-tiret et déclaration ?

Résolu
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

  1. Modérateur
    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. 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. ^^
      1. Modérateur
        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 !
      2. Ah oui, effectivement, c'est plus clair de le faire comme ça.
        Merci. :)

    Discussions similaires

    caml

    4 réponses