Questions / réponses

Fonction annexe

Fonction annexe

par Imane Abed,
Nombre de réponses : 2
Bonjour, j'ai ecris cette fonction et je ne comprend pas l'erreur, le compilateur me dit qu'à la ligne 6,  0 n'est pas un unit

let rec help  p t s =
  match t with
    Empty-> -1
   |Bin(v,Empty,Empty)-> if p v
                         then if s>0
                              then 0
                              else failwith " pas de branche satisfaisant p"
   |Bin(v,l,r)-> if p v then 1+ max (help p l s)  (help p r s)
                                 else 1+ max (help p l(s+1))  (help p r (s+1))


Merci

IA

En réponse à Imane Abed

Re: Fonction annexe

par Marc Zeitoun,

Le problème est qu'il y a un if sans else. Dans ce cas, l'expression qui suit then doit être de type unit (cela sert lorsqu'on veut faire des effets de bord, ce qu'on ne fera pas dans ce cours).

Attention aussi, tout code qui exécute un failwith ne passera pas le test.

En réponse à Imane Abed

Re: Fonction annexe

par Philippe Duchon,

Bonjour,

Il faut bien comprendre que le "if" de Ocaml ne se comporte pas comme dans les langages plus impératifs comme C ou Python.

Dans ces langages,  ce que vous mettez dans la clause then est une suite d'instructions: faire ci, faire ça; pareil pour la clause else, si elle existe - ce n'est pas obligatoire ("sinon, ne rien faire et passer à la suite").

Dans Ocaml, l'ensemble de la construction if... then... else... est une expression: elle doit donner une valeur, et une valeur unique; et qui plus est, cette expression doit avoir un type bien défini. Résultat, la clause "then" et la clause "else" doivent avoir le même type (qui sera le type de l'expression). Et si on omet le else, quelle est la valeur de l'expression? quel en est le type? C'est de là que vient le "unit" qui correspond à "pas de valeur"/"pas de type" (je simplifie).


L'erreur semble cryptique, parce que Ocaml, dans beaucoup de cas, calcule le type d'une expression (en appliquant les règles du langage, qui impliquent notamment que certaines sous-expressions doivent avoir le même type - par exemple les clauses then et else d'un même if); et si ça ne colle pas, il dit que le problème vient de là.