Ocaml _ Problème avec le type

Résolu/Fermé
CrazyGeekMan Messages postés 871 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 29 octobre 2022 - 20 janv. 2017 à 17:05
CrazyGeekMan Messages postés 871 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 29 octobre 2022 - 21 janv. 2017 à 10:48
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!
A voir également:

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
20 janv. 2017 à 19:28
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 871 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 29 octobre 2022 136
20 janv. 2017 à 22:17
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
21 janv. 2017 à 10:44
"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 871 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 29 octobre 2022 136
21 janv. 2017 à 10:48
D'accord !
Merci pour ces explications !

--
0