Quant à la réponse :
est un sucre syntaxique pour :
if cond then value else ();;
En effet, dans un langage fonctionnel, que la condition soit évaluée à true ou à false, il faut renvoyer une valeur d'un unique type. Si tu oublies le else, il faut bien trouver une valeur, donc OCaml avise que tu voulais utiliser le type (), qui est un peu le seul pour lequel il sait créer une valeur bidon.
Dans tous les autres cas, on écrit toujours une expression complète :
if cond then valuetrue else valuefalse;;
où valuetrue et valuefalse doivent avoir le même type, qui est de ce fait le type de l'expression if en entier.
Ici, tu veux renvoyer des entiers, donc, en suivant ton style, faire :
1 2 3 4 5 6 7
|
let rec somme n =
if n mod n - 1 =0
then (n-1) + somme (n-2)
else if n = 1
then 1
else 0 |
Ceci étant, je pense que tu t'y prends mal pour ce que tu veux faire :
- "n mod n - 1" se parenthèse probablement "(n mod n) - 1", et renvoie toujours 0. Peut-être que tu voulais écrire "n mod (n - 1)", cependant, ce n'est pas un progrès puisque cela renvoie toujours 1...
- Si tu souhaites à sommer les éléments de 0 à n inclus, une bonne façon naïve de faire est :
1 2 3 4 5
|
let rec somme n =
if n = 0
then 0
else n + somme (n - 1) |
Peut-être que tu peux en dire plus sur les raisons qui t'ont fait utiliser un modulo, et ce que tu voulais vraiment calculer.
Partager