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 :

erreur fonction réccursive


Sujet :

Caml

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut erreur fonction réccursive
    Bonsoir, je suis débutant en ocaml et je bloque sur un exo, si vous pouviez m'aider svp:

    Énoncé: donner une version non terminale de la fonction:
    make n v qui crée une liste de taille n initialisée avec la valeur v
    Exemple: make 3 "42" = ["42" ;"42" ;"42" ]

    Voici mon code qui produit une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # let rec make n v = 
    # if n=0 then [] 
    # else if n>0 
    # then v::(make (n-1) v);;
    File "", line 4, characters 6-8:
    Error: The variant type unit has no constructor ::

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Deux choses à mettre au clair.

    1. L'énoncé tel que tu nous le donnes est incomplet :
    • Soit l'énoncé doit préciser n ≧ 0
    • Soit l'énoncé doit préciser quoi faire quand n < 0


    2. Quelle version de ocaml ? Quelle(s) option(s) éventuellement passées(s) au compilateur ?
    Pour information je m'attendrais à un message d'erreur plus explicite dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        then v::make (n-1) v;;
             ^^^^^^^^^^^^^^^
    Error: This expression has type 'a list
           but an expression was expected of type unit
    Selon moi, le message qu'ocaml t'a matraqué est probablement du à l'usage d'une version trop récente du compilateur, d'une fonctionnalité de désambiguïsation trop hermétique pour l'usage dans l'enseignement / l'apprentissage.

    Sinon au niveau orthographe il y a 2 r dans récurrence mais dans tous les cas il n'y a qu'un seul c (récursif)
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Salut !

    En OCaml, les types attendus par les constructions "if then" et "if then else" sont différents :

    if <bool> then <unit>

    et

    if <bool> then <'a> else <'a>

    C'est plus propre comme ça. Ca force à prendre en compte tous les cas, mais ça permet quand même d'alléger la notation lors qu'on ne se sert pas de cette construction pour retourner un résultat mais simplement pour déclencher un effet de bord. Par exemple, en imaginant que tu aies une fonction f : int -> bool et un entier n, tu pourrais noter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k  = 1 to n do
      if f k then print_int k
    done
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for k = 1 to n do
      if f k then print_int k
      else ()
    done
    Ce qui est plus joli. Ca veut aussi dire que tu ne peux noter ni

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let f x = 
      if x then 1;
      0
    ni

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let f x =
      if x then 1
    (ce qui est équivalent à ce que tu as fait dans ton code)

    Si tu ne vois pas trop ce que je veux dire, utilise toujours la construction "if then else", c'est-à-dire veille à toujours avoir autant de "if" que de "else". Ca t'évitera d'oublier des cas.

    (Si tu trouves que c'est bien compliqué pour pas grand chose, dis-toi que tu as de la chance que ton expression finale ne soit pas de type "unit", auquel cas tu aurais pu oublier un cas sans que ça ne soit détecté... et si ce cas s'était présenté, ton code aurait pu faire n'importe quoi !..)

    Bon pis ensuite ça n'est pas nécessaire ici mais si tu comptes écrire de vrais programmes, je te conseille de :
    - regarder du côté de "match ... with" pour remplacer les "else if"
    - regarder du côté de "assert" pour s'assurer que n est bien supérieur à 0
    (je répète que ces machins ne sont pas forcément justifiés dans un code si simple et que le pattern matching est bien plus qu'une syntaxe alternative pour "if, else if, else", mais bon...)

    Bonne chance !

    EDIT : http://www.developpez.net/forums/d13...omprehensible/ Il me semblait bien avoir vu un problème similaire et la réponse qui allait avec il n'y a pas longtemps !

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/11/2006, 21h10
  2. [Forum] Erreur fonction mysql_result()
    Par reda93 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 01/08/2006, 10h13
  3. Réponses: 2
    Dernier message: 01/06/2006, 14h54
  4. [DOM XML] Erreur fonction load() d'un objet dom??
    Par ribrok dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h43
  5. méssage d'erreur fonction d'agrégat
    Par developpeur_mehdi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/03/2004, 12h42

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