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 :

Ordre "match" [Débutant(e)]


Sujet :

Caml

  1. #1
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut Ordre "match"
    bonjour.

    Soucieux de ne pas laisser mon cerveau s'encrouter, j'ai décidé d'essayer un peu les langages fonctionnels, et, après un rapide coup d'oeil, Ocaml m'a paru civilisé.

    J'ai trouvé ce tutoriel en français. Que j'ai suivi(avec quelques fantaisies bien rigolotes) avec succès jusqu'à la partie "match". Et c'était cool.

    L'exemple du tutorial est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # let var = 2 ;;
    val var : int = 2
     
    # match var with
      | 1 -> "un"
      | 2 -> "deux"
      | 3 -> "trois"
      | _ -> "je ne sais pas compter au delà de trois"
      ;;
    - : string = "deux"
    Il marche parfaitement, évidemment. Mais j'ai voulu aller plus loin, et coder un fizzbuzz. Mon premier, basé sur un enchevetrement de if/else if fonctionnait bien, mais était horrible. J'ai donc essayé un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # let display_fizzbuzz var =
    match 0 with
      | var mod 15 -> "fizzbuzz"
      | var mod 5   -> "buzz"
      | var mod 3   -> "fizz"
      | _ -> string_of_int (var)
      ;;
    ça n'a pas marché. J'ai essayé pas mal de choses, j'ai même essayé de mettre un booléen, mais j'ai eu l'impression qu'il est impossible de mettre autre chose qu'une valeur seule aux aiguillages. Est-ce que la limite est réelle, ou existe-t-il un moyen propre de tricher? Suis-je obligé de précalculer les restes de mes divisions dans des valeurs AVANT le match(ce qui le rendrait nettement moins tentant)?


    Question subsidiaire : la boucle d'interaction sous windows a planté pas mal de fois. Bon, en tant que débutant, j'ai du faire pas mal d'erreurs, mais est-ce que c'est vraiment instable, ou est-ce que je devrais vérifier ma config(je suis sous windows 7).
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  2. #2
    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
    Le tutoriel que tu suis est très, très sommaire. Il est là pour donner une introduction rapide au langage, pas pour expliquer les concepts en profondeur. Du coup il est tout à fait normal que tu aies du mal à généraliser la notion de filtrage de façon correcte (ce n'est ni "ta faute" ni celle du tutoriel qui n'a pas cette ambition). Si ce que tu as vu jusqu'à présent te plaît, tu devrais envisager de passer à un document plus complet. Dans la catégorie toujours "on va à l'essentiel", je te conseille l'Introduction à OCaml de Maxence Guesdon, et pour du "copieux car complet" tu as le livre en ligne Développement d'applications avec OCaml.

    Pour répondre à ta question précise, on peut généraliser le filtrage à quelque chose de plus riche mais pas du tout comme tu le fais. Il sert à déconstruire des valeurs en observant leur structure, pas à faire des tests conditionnels arbitraires (c'est un "switch" en beaucoup mieux, pas un "cond" de LISP). Si tu veux faire des tests à la chaine, utilises des if..then..else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      let divise n var = (var mod n = 0) in
      if divise 2 var then ...
      else if divise 3 var then ...
      else ...
    Ah et si par "boucle d'interaction" tu entends OCamlWin, c'est un vieux programme dont je ne suis pas certain qu'il soit encore maintenu (parce que personne ne l'utilise). Tu peux utiliser Emacs qui a un bon support de l'édition OCaml interactive, ou n'importe quel couple éditeur/compilo, ou un bon terminal si ton système d'exploitation t'en propose (pas sûr que ça coure les rues sous Windows, mais si un jour tu veux essayer GNU/Linux...). Je connais des gens qui utilisent des machines virtuelles GNU/Linux pour leur développement logiciel hors-dotNet et qui en sont assez contents. Sinon tu peux aussi utiliser le toplevel OCaml directement en ligne (existe aussi sous forme d'applet Java), mais personnellement je préfère un vrai éditeur où on peut facilement sauvegarder son travail, etc.

  3. #3
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    OK, merci pour tous ces renseignements. Il va me falloir un peu de temps pour digérer tout ça... J'ai commençé par un tutorial basique pour me familiariser, ça a l'air marrant, varié, et puissant, mais je dois encore tordre un peu mon cerveau pour m'adapter(le faible nombre de parenthèses est assez déstabilisant pour moi). J'irais sur le plus massif dans un deuxième temps.

    Je suis un peu déçu de devoir emboiter des else-if (j'ai toujours trouvé ça moche, et le select case true du vieux VB6 permet des merveilles.), mais bon, ça n'est pas catastrophique.

    Je ne me mettrais pas à Linux dans un avenir proche, pour plein de raisons(à commencer par ma femme que je ne dois pas déstabiliser avec un nouvel environnement).

    EMacs s'est installé en même temps que la boucle d'interaction, je vais essayer de trouver comment on fait du OCaml dessus.

    Encore une fois, merci pour ta réponse.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  4. #4
    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
    J'ai une bonne expérience des débutants qui, enthousiasmés par la construction match..with, s'en resservent à toutes les sauces à des endroits ou ce n'est pas nécessaire, voire ou ça introduit des erreurs dans leur programme car ça ne font pas ce qu'ils pensent.

    Mon conseil est de n'utiliser le pattern-matching que sur des types algébriques : listes, option, et types sommes/records définis à la main.

    Un exemple de bug qu'on retrouve très souvent chez les débutants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type coords =
      | Telephone of string
      | Pseudo of string
     
    let mon_tel = "0123456789"
    let mon_pseudo = "gasche"
     
    let est_ce_moi = function
      | Telephone mon_tel -> true
      | Pseudo mon_pseudo -> true
      | _ -> false
    Pour GNU/Linux il y a moyen de l'installer en dual boot (à côté de Windows) mais aussi maintenant dans une machine virtuelle, c'est-à-dire un programme comme un autre qui tourne sur ton système (exemples). Mais Windows devrait aussi convenir, en particulier avec le nouvel installateur Windows pour OCaml 4.00.

  5. #5
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Merci pour ça aussi. Je vais attendre d'avoir ma nouvelle bécane pour faire ce genre d'essais(elle devrait arriver dans une semaine). Pour l'instant, je vais continuer à jouer avec la boucle pour voir un peu ce qu'on peut faire, pour ça, ça suffit - même si parfois elle fait boum. Effectivement, pour faire un vrai projet, ça ne semble pas permettre d'aller assez loin. Et j'ai quelques petits trucs en tête.

    Et je retiens le fat que match est un ordre plus limité que select case(qui permet de comparer n'importe quoi avec n'importe quoi). Après tout, il semble quand même mieux que l'infâme switch case du C#/Java, qui ne permet que de mettre des break(des goto qui ne disent pas leur nom) dans le code. Par contre, j'adore le type. J'ai joué avec, c'est simple propre, et efficace.

    Bon, maintenant, il faut que je comprenne la récursivité terminale. J'ai calé dessus hier soir, mais j'étais fatigué. J'ai compris à quoi ça sert, mais pas comment le faire sans lire l'exemple...

    Ton installeur windows est celui que j'ai utilisé(il m'a installé la boucle d'interaction, Emacs, plus deux trucs que je n'ai pas encore regardés, Cygwin et TCL). A terme, je dois vraiment me mettre à Emacs, mais c'est un peu hostile pour moi, habitué à visual studio et à ISPF. En même temps, c'est pour briser mes habitudes que je m'y mets.....
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  6. #6
    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
    100% des erreurs/plantages sous windows sont dus à OCamlWin(Plus).
    Un seul remède connu : effacer tous les programmes dont le nom commence par OCamlWin.

    Ensuite tu as le choix entre la ligne de commande (ocaml dans cmd.exe) et un IDE générique comme Crimson Editor ou PSPad.
    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.

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