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 :

Evaluer une fonction


Sujet :

Caml

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Evaluer une fonction
    Bonjour, pourriez vous m'aider à comprendre comment évaluer la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec filtrer = fun p -> function
              | [] -> []
              | x::l -> if p x then x::(filtrer p l) else filtrer p l;;

    la fonction filter prend un premier argument. Etant donné que l'on a dans le code if p x alors on peut déduire que p est une fonction renvoyant un boolean.
    filter renvoit également une liste


    Si je m'arrête là, la logique voudrait que cette fonction soit évalué par

    ('a-> bool) -> 'a list


    Sauf que la bonne évaluation est

    ('a-> bool) -> ('a list) -> 'a list

    Je vois bien que l'un des arguments de la fonction est une liste vu qu'on matche une liste...mais pourtant ça ne me parle pas du tout quand je vois la fonction écrite ainsi


    J'aurais plutôt écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec filtrer = fun p -> fun l1 -> match l1 with
              | [] -> []
              | x::l -> if p x then x::(filtrer p l) else filtrer p l;;
    Je trouve cette écriture bien plus logique et compréhensible...en un coup d'oeil on voit ce qu'il se passe.


    Là, on a remplacé le fun l1 -> match l1 with par function....et je ne comprends pas cette écriture là...

    En espérant que vous ayez compris mon problème^^

  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
    Le mot-clé function ... est une sorte de raccourci pour fun v -> match v with ... où la variable v devient anonyme.

    On pourrait aussi écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec filtrer p = function
      | [] -> []
      | x::l -> if p x then x::filtrer p l else filtrer p l;;
    Ce ne sont que des variantes syntaxiques.
    Il n'y a aucune différence entre elles.
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Le mot-clé function ... est une sorte de raccourci pour fun v -> match v with ... où la variable v devient anonyme.

    On pourrait aussi écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec filtrer p = function
      | [] -> []
      | x::l -> if p x then x::filtrer p l else filtrer p l;;
    Ce ne sont que des variantes syntaxiques.
    Il n'y a aucune différence entre elles.
    Merci beaucoup pour ta réponse, je trouve quand même que...même si le code est plus court, on perd en lisibilité lorsqu'il faut maintenir. Je ne vois vraiment pas quel intérêt on peut avoir à cacher une variable ainsi...

    Quoi qu'il en soit, merci.

  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
    En Java il y a la notion d'arité :
    • une méthode possède un nombre fixe et défini d'arguments
    • lorsqu'on appelle cette méthode il faut lui fournir exactement ce nombre d'arguments, sinon il y a erreur


    En (O)Caml la notion d'arité n'existe pas :
    • on n'appelle pas une fonction, on lui applique un argument
    • même si la fonction semblait attendre plus ou moins d'arguments il n'y a pas forcément d'erreur


    En Java l'identité aurait exactement un argument :
    En (O)Caml l'identité accepte un nombre quelconque d'arguments :
    Du coup, comme il n'y a pas de notion d'arité, il n'y a pas le critère de lisibilité qui va avec (identifier clairement et lisiblement le nombre d'argument).

    Ce qui compte c'est le type fonctionnel que (O)Caml va inférer, le reste on s'en fiche complètement.

    Il y a une façon peut être moins alambiquée d'expliquer ça à un programmeur Java.
    Imagine que filter_of_list est une classe pour filtrer les listes.

    Un constructeur pour cette classe pourrait être make_filter_of_list qui, étant donné un prédicat p, renvoie un objet qui peut filtrer une liste selon p :
    Code Caml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let rec make_filter_of_list p =
      function
      | [] -> []
      | x::l -> if p x then x::make_filter_of_list p l else make_filter_of_list p l;;

    Créer un filtre de liste qui élimine tous les "mauvais" éléments :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    make_filter_of_list (function `Bon _ -> true | `Mauvais _ -> false);;
    Et c'est plus court que :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    make_filter_of_list (fun x -> match x with `Bon _ -> true | `Mauvais _ -> false);;
    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.

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

Discussions similaires

  1. Evaluer une fonction
    Par ortholle dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 13/01/2010, 16h40
  2. Evaluer une fonction a deux variables.
    Par Kichott dans le forum MATLAB
    Réponses: 7
    Dernier message: 04/07/2009, 09h14
  3. Evaluation d'une variable dans une fonction
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/09/2007, 10h10
  4. Evaluer une fonction
    Par NELLLY dans le forum MATLAB
    Réponses: 8
    Dernier message: 14/06/2007, 21h20
  5. Evaluations des paramètres d'une fonction
    Par WebPac dans le forum Langage
    Réponses: 15
    Dernier message: 06/10/2005, 09h46

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