Probleme de type avec OCaml

Probleme de type avec OCaml - Langages fonctionnels - Programmation

Marsh Posté le 13-05-2009 à 16:40:19    

Bonjour tout le monde,
Je suis depuis quelques jours sur cette erreur, et j'aimerais avoir de l'aide pour comprendre d'ou vient le probleme de type dans mon programme OCaml.
 
Voici la structure ainsi qu'un peu de mon code :
J'ai un fichier Monitor, qui contient une fonction timer :

Code :
  1. (*
  2. * @file monitor.ml
  3. * @brief Timer function that measure the time of the execution of the code.
  4. * @param flag The associated name of the measuring time.
  5. * @param f The code to measure.
  6. *)
  7. let timer (flag, f) =
  8.   Printf.printf "In timer\n";
  9.   let timeBef = Unix.gettimeofday() in
  10.   let result  = f() in
  11.   let timeAft = Unix.gettimeofday() in
  12.   let channel = open_out_gen [Open_append] 700 "time.txt" in
  13.       Printf.fprintf channel "%s: %.8f\n" flag (timeAft -. timeBef);
  14.       close_out channel;
  15.       result


Dont voici le fichier .mli associe :

Code :
  1. (* @file monitor.mli *)
  2. val timer : string * (unit -> 'a) -> 'a


Ainsi, quand j'appelle cette fonction dans mon code de base de la facon suivante, il n'y a aucun probleme... :

Code :
  1. let return = Monitor.timer ("Elaborate", fun () -> toto tata)


Cependant, si j'ai quelque chose de la forme suivante :

Code :
  1. let return = Monitor.timer ("Elaborate", fun () -> (toto tata;
  2.                                                     toto titi )


Il me met le message d'erreur suivant :

Code :
  1. File "reconstruct.ml", line 3193, characters 79-83:
  2. Warning S: this expression should have type unit.


Et ce warning devient alors problematique car des que j'utilise return, il n'a pas le bon type, et j'ai le droit a un vrai message d'erreur tel que :

Code :
  1. This expression has type unit * "whatever" but is here used with type "whatever" * "whatever"


 
Est ce qu'il y aurait un moyen de forcer un type a unit ?  
Je debute quelque peu l'OCaml, veuillez me pardonner si c'est une question debile, mais je ne vois vraiment pas comment faire...
Merci pour votre aide...
Tibap.


Message édité par Tibap le 13-05-2009 à 17:13:21
Reply

Marsh Posté le 13-05-2009 à 16:40:19   

Reply

Marsh Posté le 13-05-2009 à 17:08:14    

Pour le warning, ton "toto tata" renvoie une valeur (son type n'est pas unit) que tu ne récupères ni n'utilise, le compilo t'en fais donc part puisque c'est potentiellement une erreur de ta part.

 

Pour l'erreur, aucune idée, le code que tu as donné est complet? Le message d'erreur aussi? ('fin d'un autre coté je connais pas du tout l'ocaml donc bon...) Et pourquoi utiliser des arguments uncurried à Timer?

 

Accessoirement, t'es censé renvoyer quoi de timer? parce que si je ne m'abuse et que ton code est complet, là il va retourner le résultat de close_out channel, ce dont je vois mal l'intérêt...


Message édité par masklinn le 13-05-2009 à 17:09:39

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-05-2009 à 17:21:02    

Desole, en effet, j'ai oublie de renvoyer result, c'est a dire que mon timer renvoie le code de la fonction mesuree... (j'ai edite mon precedent message, maintenant c'est bon.)
Ainsi, la variable return dans mon fichier principal contient une valeur... que j'utilise dans une prochaine instruction.
J'ai alors le message d'erreur suivant :

Code :
  1. This expression has type unit * Syntax.Int.LF.sub but is here used with type
  2.   Syntax.Int.LF.kind * Syntax.Int.LF.sub


En realite, le probleme ne se concentre que sur ce que j'ai explique + haut, c'est pour ca que je n'ai pas mis tout mon code, qui est assez important...
Merci d'avoir repondu, j'espere avoir ete assez clair.
-Tibap

Reply

Marsh Posté le 15-05-2009 à 17:13:02    

C'est bon, j'ai trouve ce qui n'allait pas...
En fait, je stockais le resultat de ma fonction passe en argument dans result. Cependant, si j'effectue deux commandes dans ma fonction, j'ai deux valeurs de retour... ce qui n'etait pas souhaitable ici.
Par consequent, il faut juste ignorer la valeur de retour qui n'est pas interressante.
Voila...
-Tibap

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed