Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1614 connectés 

  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Probleme de type avec OCaml

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de type avec OCaml

n°1884301
Tibap
Posté le 13-05-2009 à 16:40:19  profilanswer
 

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
mood
Publicité
Posté le 13-05-2009 à 16:40:19  profilanswer
 

n°1884308
masklinn
í dag viðrar vel til loftárása
Posté le 13-05-2009 à 17:08:14  profilanswer
 

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
n°1884311
Tibap
Posté le 13-05-2009 à 17:21:02  profilanswer
 

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

n°1885034
Tibap
Posté le 15-05-2009 à 17:13:02  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Probleme de type avec OCaml

 

Sujets relatifs
[VB.Net Express 2008] Problème debugger[VBA] Problème double macro
Problème balise objectProblème service pilot
Problème avec le système de Don PaypalProblème d'importation de bdd
[Résolu] Problème d'échappement d'apostrophesProbleme transparence sous IE
[C] Probléme de récupération des données à travers ttyS (LINUX)Problème de bannière flash sous IE
Plus de sujets relatifs à : Probleme de type avec OCaml


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR