IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Probleme de condition


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Probleme de condition
    Bonsoir à tous,

    J'ai un probleme sous Ocaml pour formuler une condition du type :
    si condition_rempli alors faire_qlqchose
    sinon ne_rien_faire

    Concretement, je teste l'existence d'intersections, si elles existent je calcule celles-ci, sinon je ne fais rien.
    Le soucis est qu'on ne peut pas, à ma connaissance, formuler comme en C par exemple une condition if sans un else.
    Je travaille avec des listes de tuples : (booleen,[list_de_sommets]) , et si le premier élément de chaque tuple est 1 on calcule l'intersection et si c'est 0 on ne fait rien.

    Quelqu'un aurait une solution pour pallier à ce problème ?
    Merci d'avance

  2. #2
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Si : tu peux mettre un if sans else. Caml comprend cela comme "sinon, ne rien faire". Tu peux l'expliciter si tu le souhaites, "ne rien faire" se note comme ceci : ().

    Attention toutefois : si tu renvoies une valeur dans le "then", il faut bien sûr que tu renvoies une valeur de même type dans le "else". "if test then 4" n'a pas de sens, du fait du typage statique.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le fait de ne pas mettre de else sur cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     let inter_surf_tri f triang eps =
      let list_bool_inter = is_inter_surf_tri f triang in
      if fst(list_bool_inter) = 1 then
      	begin
      	match snd(list_bool_inter) with
      	| [1;1;0] -> dicho f (L.nth triang 0) (L.nth triang 1) eps
      	| [1;0;1] -> dicho f (L.nth triang 0) (L.nth triang 2) eps
      	| [0;1;1] -> dicho f (L.nth triang 1) (L.nth triang 2) eps
      	end;;
    me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    This expression has type point3d but is here used with type unit
    A noter que dans le match, je n'ai que 3 possibilités donc pas besoin de tester tous les cas.
    J'ai surement mal formulé ma fonction dans ce cas...

  4. #4
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    C'est précisément ce que je t'ai dit : les expressions du genre "if test then 4" n'ont pas de sens.

    Si tu souhaites que ta fonction "inter_surf_tri" renvoie une valeur utile, alors il faut renvoyer quelque chose dans le else (sinon, c'est une erreur de logique).

    Si tu souhaites que ta fonction ne renvoie rien (ou plutôt, un type unit), il ne faut rien renvoyer dans le then. La fonction ignore peut éventuellement être utile.


    P.S. : fais attention, ton pattern matching est incomplet.

  5. #5
    alex_pi
    Invité(e)
    Par défaut
    Pour étendre un peu la réponse de LLB :

    Quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if expr_test then
      expr_then
    else
      expr_else
    Le typeur vérifie d'abord que expr_test est de type bool, et que expr_then et expr_else sont du même type (appelons le T). En effet, sans connaitre la valeur de expr_test, on ne peux pas savoir laquel des deux branche sera évaluée. Il faut donc se "préparer" aux deux possibilité et exiger que vu que de l'extérieur, c'est bien la même chose. Et enfin, l'ensemble reçoit le type T.

    Ensuite, pour des raisons de concision, OCaml t'autorise à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if expr_test then expr_then
    qui est interprété comme étant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if expr_test then expr_then else ()
    Or () est de type unit, donc la règle plus haut nous impose que expr_then soit de type unit.
    Tu ne peux donc rien retourner d'autre.

    La meilleur solution à ton problème est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if expr_test then Some (expr_then) else None
    Et là, hop, le typeur est content

  6. #6
    Invité
    Invité(e)
    Par défaut
    P.S. : fais attention, ton pattern matching est incomplet.
    Oui je sais mais dans mon cas précis, je n'ai uniquement 3 cas à considéré donc je n'ai pas besoin de tester tous les cas

    La meilleur solution à ton problème est de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if expr_test then Some (expr_then) else None
    Et là, hop, le typeur est content
    Ah impec', c'est vrai que maintenant il ne me pose plus de soucis.
    Du coup il me retourne un type "type_t option" au lieu d'un "type_t" prévu, quelle est la différence ? Est ce que je peux le reconvertir, par la suite, en "type_t" ?
    Merci par avance.
    Dernière modification par Invité ; 18/01/2009 à 14h03.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 05/05/2006, 09h13
  2. [AS] Probleme de condition
    Par Treuze dans le forum Flash
    Réponses: 8
    Dernier message: 25/03/2006, 15h27
  3. probleme de condition et de boucle
    Par avantoux dans le forum ASP
    Réponses: 5
    Dernier message: 23/03/2006, 08h59
  4. Probleme de conditions
    Par guy2004 dans le forum Langage
    Réponses: 11
    Dernier message: 05/11/2005, 14h54
  5. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo