Ocaml _ Problème avec le type

Résolu
CrazyGeekMan Messages postés 971 Statut Membre -  
CrazyGeekMan Messages postés 971 Statut Membre -
Bonsoir,

Avant de poser ma question j'ai essayé de trouver la réponse par moi même mais je n'arrive pas :/
Mon but était tout simple : créer une fonction qui affiche la valeur absolue de x entré dans le code source.

Ainsi ce code fonctionne :
let val_abs x = 
if x<0 then print_int x
else print_int x;;
print_newline();;
val_abs 2;;


Mais dès que je rajoute une valeur négative il y a l'erreur
File "Ex_2.ml", line 2, characters 12-21:
Error: This expression has type int -> unit
but an expression was expected of type int
let val_abs x = 
if x<0 then print_int -x
else print_int x;;
print_newline();;
val_abs 2;;

Même chose avec ce code :
File "Ex_2.ml", line 5, characters 0-7:
Error: This expression has type int -> unit
but an expression was expected of type int
let val_abs x = 
if x<0 then print_int x
else print_int x;;
print_newline();;
val_abs -2;;


C'est donc bien dû au - mais pourtant -2 reste toujours un entier...

Si quelqu'un pourrait m'aider ce serait super sympa ;)
Merci et bonne soirée!

1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
Bonjour,

Le problème c'est la priorité de l'opérateur
-
qui fait que Caml tente de soustraire x à print_int (ce qui n'a pas de sens).

Cela se règle avec des parenthèses.

let val_abs x = 
if x<0 then print_int (-x)
else print_int x;;

val_abs (-5);;

Remarque : la valeur absolue est une fonction de calcul d'un entier qui donne un autre entier, tu ne devrais donc pas faire l'affichage dans cette fonction, mais plutôt afficher le résultat de la fonction.

let val_abs x = 
if x<0 then -x
else x;;

val_abs (-5);;

let print_abs x =
print_int (val_abs x);;

print_abs (-5);;
0
CrazyGeekMan Messages postés 971 Statut Membre 139
 
C'est tout à fait ça, merci !
Je me permet de corriger cette petite coquille :)
let val_abs x = 
if x<0 then (-x)
else x;;

val_abs (-5);;

let print_abs x =
print_int (val_abs x);;

print_abs (-5);;


Bon je pensais que le programme comprendrais que quand j'écris -x alors ça équivaut à -1*x ; ça marche dans le second cas.

Merci !
0
KX Messages postés 19031 Statut Modérateur 3 020
 
"Je me permet de corriger cette petite coquille"
Si tu parles du
then -x
en
then (-x)
en réalité c'est inutile.

La priorité de
-
avec le then est différente car c'est un mot clé du langage, donc Caml sait que tu ne peux pas faire de soustraction de then, contrairement à print_int qui est une fonction.
0
CrazyGeekMan Messages postés 971 Statut Membre 139
 
D'accord !
Merci pour ces explications !

--
0