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 :

Modules pour statistiques/probabilités/IA en OCaml ?


Sujet :

Caml

  1. #21
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let rev_fold2 f init l1 l2 =
      let rec helper init l1 l2 =
        match l1 , l2 with
        | [] , [] -> Some init
        | a1::l1 , a2::l2 -> helper (f a1 a2 init) l1 l2
        | _ , _ -> None
      in helper init l1 l2
    
    (* not tail recursive *)
    let fold2 f init l1 l2 =
      let rec helper l1 l2 =
        match l1 , l2 with
        | [], [] -> Some init
        | a1::l1 , a2::l2 ->
            ( match helper l1 l2 with
            | None   -> None
            | Some t -> Some (f a1 a2 t)
            ) 
        | _ , _ -> None
      in helper l1 l2
    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.

  2. #22
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Là encore c'est une question de style, je conçois très bien que pour d'autres usages celà fasse sens que List.map2 lève une exception. Mais c'est à moi qu'il revient d'en décider, au cas par cas, pas à quelqu'un qui aurait déjà choisi son camp.
    Comment veux-tu qu'on te laisse le choix ? En mettant les deux fonctions dans la bibliothèque ?

    Quelle que soit la méthode choisie dans la bibliothèque, c'est facile d'en changer le comportement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let force = function Some x -> x | None -> raise (Invalid_argument "force")
    let tryf f x = try Some (f x) with Invalid_argument _ -> None
    Il y a certains cas où l'exception se justifie pleinement. Ce serait pénible si, par exemple, la division renvoyait un type option.

  3. #23
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (* not tail recursive *)
    let fold2 f init l1 l2 =
      let rec helper l1 l2 =
        match l1 , l2 with
        | [], [] -> Some init
        | a1::l1 , a2::l2 ->
            ( match helper l1 l2 with
            | None   -> None
            | Some t -> Some (f a1 a2 t)
            ) 
        | _ , _ -> None
      in helper l1 l2
    C'est pas simple de faire un choix, mais quand même (bechmark pipo) :

    • en cas d'échec
      • En byte code
        version avec exception 183% plus lent ! j'avoue, je ne m'attendais pas à un facteur 3, mais surtout pas dans ce sens..
      • En optimisé
        version avec type option 6% plus lent (seulement)
    • En cas de réussite
      • En byte code :
        option 30% plus lent
      • En optimisé
        option plus lent de... 633% !


    Donc effectivement, si on compte compiler en bytecode et généralement échouer, il vaut mieux utiliser la version option. Par contre, en optimisé, en s'attendant à généralement réussir, la version avec exception est plus de 7 fois plus rapide. On peut comprendre le choix de la librairie standard je trouve. Surtout que l'empacter dans une version retournant un type option n'est pas bien complexe.

  4. #24
    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
    Citation Envoyé par SpiceGuid Voir le message
    Les exceptions c'est la façon impérative de traiter les erreurs, et parfois ça manque de composabilité sémantique.
    Quand tu dois unifier deux listes de termes et que List.map2 unify l1 l2 lève une exception Invalid_argument (listes de longueur différentes) au lieu de te renvoyer None ça te paraît beaucoup moins cohérent (avec ta sémantique).[...]
    C'est ton point de vue. Le point de vue des concepteurs d'OCaml a été de considérer que l'exception sert à traiter tout cas anormaux. Et à ce moment cela devient cohérent. Je ne dis pas que l'un est meilleur que l'autre. Je dis que ce sont deux manières différentes de percevoir et que je ne pense pas que l'une est meilleure que l'autre ni plus justifiée. Une justification pour l'exception serait que les cas sont traités plus rapidement. Les méthodes par continuation permettent d'obtenir les exceptions (car sont plus général) et servent même souvent à une ça d'une certaine façon. Je ne crois pas qu'on puisse accuser l'approche par continuation d'être impérative. Donc ça se discute tout ça.

  5. #25
    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
    Citation Envoyé par alex_pi Voir le message
    [...]
    version avec exception 183% plus lent ! j'avoue, je ne m'attendais pas à un facteur 3, mais surtout pas dans ce sens..[...]
    Étonnant. Tu es sûr de tes résultats ?
    Bon c'est une autre discussion maintenant. On pourrait en ouvrir une non ?
    Je serais curieux de savoir pourquoi.

  6. #26
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Oui, sans avoir fait de test ça me semble étonnant aussi, je serais curieux de voir le code complet.

    Par ailleurs, une "vraie" version avec type option utiliserait une exception en interne (pendant la récursion) et encapsulerait le tout dans un type option, je pense. Ça revient à la doctrine "exceptions en internes, mais pas à l'interface des modules" qui est à mon avis assez intéressante "en général", mais qui n'est effectivement pas le choix de la stdlib.
    Comme cela a déjà été montré, on peut facilement envelopper tout ça quand on en ressent le besoin (let result f x = try `Result (f x) with exn -> `Error exn , puis on peut utiliser des monades (pa_monad), etc.).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. module de statistique
    Par michou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 08/12/2005, 13h47
  2. [Apache] compiler le module pour Ruby mod_ruby.so ?
    Par Mescalito dans le forum Apache
    Réponses: 1
    Dernier message: 02/11/2005, 18h28
  3. recherche de module pour faire des graphiques
    Par Ickou dans le forum Modules
    Réponses: 1
    Dernier message: 01/11/2005, 22h20
  4. Bonjour, des modules pour Truevision3d ?
    Par Phomos dans le forum C++
    Réponses: 1
    Dernier message: 28/09/2005, 18h18
  5. [RECHERCHE] un module pour developer une interface graphique
    Par romtrash dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/03/2005, 15h46

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