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 :

Déclarer une fonction dans une autre fonction


Sujet :

Caml

  1. #1
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut Déclarer une fonction dans une autre fonction
    Bonjour, est-il possible de déclarer une fonction dans la définition d'une autre fonction ? Si oui, comment ? Merci d'avance !

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ceci devrait répondre à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let f x = 
      let incr x = x+1 in
      incr (incr x);;
    Toutefois, dans cet exemple, incr n'est pas accessible en dehors de la définition de f.

  3. #3
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Et peut-on déclarer (toujours dans une fonction) une fonction dont la définition prend plusieurs lignes ? Et comment arrêter la définition de la fonction secondaire pour revenir à la définition de la fonction principale ?

  4. #4
    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 exemples tirés de mon tutoriel :

    Code Caml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let power x n =
      let rec loop acc n =
        if n=0 then acc else loop (acc *. x) (n-1)
      in loop 1. n;;
    
    let fibonacci n =
      let rec loop acc0 acc1 n =
        if n < 2 then acc1 else loop acc1 (acc0 + acc1) (n - 1)
      in loop 1 1 n;;
    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Merci !

  6. #6
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Salut !

    Une réponse un peu plus centrée sur le « raisonnement » (un bien grand mot pour peu de choses ici) : dans les langages fonctionnels, les fonctions sont des éléments de première classe. Elles peuvent donc être manipulées comme n'importe quel type de base. Bref, aucune limitation théorique au contenu et aux imbrications.

    Cordialement,
    Cacophrène

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Dernières précisions :

    Une fonction définie à l'intérieur d'une autre est une fonction qui va aider la première en factorisant une partie des opérations dans la seconde.

    Un exemple typique : les fonctions telles que celles données par SpiceGuid plus haut -> la fonction intérieure va être la fonction récursive and la fonction visible par l'extérieur ne fera que transmettre des informations à la fonction intérieure.

    La fonction intérieure est délimitée par le let ... in, comme tu peux le voir dans les divers exemples.

    Peut-être que un ou deux exemples bidons t'aideront :
    Code caml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let transform list = 
      	let assoc = function
      		| 0 -> 11
      		| 1 -> 0
      		| _ -> 10
      	in List.map assoc list
      ;;
    
    - : val transform : int list -> int list = <fun>
    
    transform [1;0;2;1;0;3;1;0;0;0;0;0;1;1;0;1;1;1;1;0];;
    - : int list =
    [0; 11; 10; 0; 11; 10; 0; 11; 11; 11; 11; 11; 0; 0; 11; 0; 0; 0; 0; 11]

  8. #8
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Merci bien pour votre aide. Une autre question (si vous voulez bien) : comment affiche-t-on un vecteur ? J'aimerais pouvoir, selon une condition, afficher 2 vecteurs, et sinon ne rien faire.

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Un vecteur ?
    Une liste tu veux dire ?
    Un Array ?
    ou un type vecteur défini par tes propres soins ?

  10. #10
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Ben non, il y a bien un type qui s'appelle vecteur non ? Les listes entre [| |].

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ce sont des arrays :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [| |];;
    - : 'a array = [||]
    Sinon, une façon propre d'afficher un array (ce qui s'avère utile que si tu n'es pas dans le toplevel), c'est d'utiliser la fonction iter du module Array de la bibliothèque standard.

    Un exemple avec un int array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # let f x = print_int x;;
    val f : int -> unit = <fun>
    # let arr = [| 1 ; 2 ; 3 ; 4 ; 5 |];;
    val arr : int array = [|1; 2; 3; 4; 5|]
    # Array.iter f arr;;
    1
    2
    3
    4
    5
    - : unit = ()

  12. #12
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    C'est bizarre quand même, puisque j'utilises des fonctions dont le nom contient "vect".

    Lorsque je fais :

    let arr = [| 1 ; 2 ; 3 ; 4 ; 5 |];;

    j'obtiens :

    #arr : int vect = [|1; 2; 3; 4; 5|]

  13. #13
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ah, tu utilises Caml Light ?

    Si oui, regarde do_vect ici : http://caml.inria.fr/pub/docs/manual...node14.18.html :
    Exemple d'utilisation : changer Array.iter par do_vect dans l'exemple que j'ai donné juste au-dessus.

  14. #14
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Merci !

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Si on a répondu à ta question pense à ^_^

  16. #16
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Désolé de réécrire dans le même sujet, mais j'aimerais savoir comment on ferme l'effet d'une condition :

    si [condition] alors [action1] fin
    [action2]

  17. #17
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il n'y a rien à indiquer pour ce faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let egal_zero x = if x=0 then true else false;;
    <la suite>
    A moins que dans ton cas, il s'agisse que d'un if [qqch] then [qqch], auquel cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if <condition> then <action> else ()
    <la suite>

  18. #18
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Effectivement, ça marche, mais si je mets 2 actions dans le then, il y a un problème (le if ne se ferme pas). Voici mon code :

    if palind v (vect_length v) then affiche u ; affiche v ;

    print_newline() ;;

    Le print_newline() est lu comme étant dans le then.

    Suis-je obligé de mettre else () ?

  19. #19
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pourquoi, tu dois payer 10€ à chaque fois que tu mets "else ()" ?

    PS : la programmation impérative, il faut la limiter autant que possible.

  20. #20
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Ok ok ^^. Bon si j'ai bien compris, va falloir que j'utilise des fonctions. A propos, y-a-t'il une différence pour le compilateur entre définir une fonction à part, puis l'appeler dans une nouvelle fonction ; et définir une fonction là où on a besoin de l'appeler ?

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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