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 :

Typage Caml light (je suis totalement perdu!)


Sujet :

Caml

  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Typage Caml light (je suis totalement perdu!)
    Bonjour!
    Pouvez-vous m'aider pour cet exercice d'informatique car je suis totalement perdu!! Il est basé sur le logiciel CAML LIGHT (et je ne comprends vraiment pas!)!
    Merci bcp!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Let rec hase tes rixe=
    Let gros [bon ; homme] =
    If bon < homme
    Then bon ^ homme (opérateur de concaténation des chai,es de caractère)
    Else homme ^bon
     
    In
    If tes=baie
    Then gros ( haubert rixe )
    Else hase (int_of_float rixe) (rixe /. 20.07)

    Selon Pierre, il faut copier d’autres choses avant la déclaration de cette fonction bien hase. Mais il prétend malgré tout que ce n’est pas un obstacle à la vérification de la signature (ou typage) de cette fonction.

    1) confirmer cette affirmation en réalisant explicitement le calcul de son type.
    2) qu’en déduisez-vous sur la signature des 2 identificateurs globaux qui manquent dans ce devoir ?
    3) Pierre prétend que c’est lourd de déclarer ainsi la fonction locale et qu’il aurait mieux valu lui attribuer un autre typage, quitte à modifier en premier chef le haubert. Pouvez-vous préciser à quoi il pense

  2. #2
    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
    Le but du forum n'est pas de faire les devoirs des gens. Dis ce que tu ne comprends pas, et on essaiera de t'aider.

    Tu dois typer la fonction "hase".
    Tu vois qu'elle prend deux arguments : tes et rixe. Sa signature sera donc du type 'a -> 'b -> 'c. Il reste à déterminer à quoi correspondent 'a, 'b et 'c.

    En regardant l'opérateur utilisé dans "gros", tu peux en facilement déduire le type de retour et le type de des arguments de "gros".

    Puisque le then et le else d'un if doivent avoir le même type, tu sais que le type de retour de gros est le même que celui de hase.

    Enfin, la dernière ligne t'indique clairement quels sont les types des arguments de hase.


    Bref, il faut regarder les contraintes qui s'appliquent sur le code pour résoudre le typage.
    Ce qu'il faut savoir, c'est que :
    l'opérateur ^ a pour type : string -> string -> string
    l'opérateur = a pour type : 'a -> 'a -> 'a
    l'opérateur /. a pour type : float -> float -> float
    Ensuite, tu regardes les appels de fonction... ce n'est pas très compliqué.

    Quelle partie exactement ne comprends-tu pas ?


    Pour la question 2, c'est le même principe (pour type baie et haubert).

  3. #3
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Déjà, commence par écrire correctement les mots-clef : if et non If, etc... ensuite, on verra pour le reste.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    voila ce que jai fait en etudiant cette fonction...mais plagre letude, je narrive pas à deduire tt ce qu'il faudrait!

    1ere ligne: on définit une fct recursicve hase qui possede 2 variables tes et rixe. avec 'a->'b->'c

    2ème: gros est une liste a 2 éléments (mais je narrive pas a ded le typage a ce niveau..ce n'est pas string car il n'y a pas de ""??)

    je ne sais pas quoi deduire de la 3eme ligne.

    4ème: on ibtient un resultat du type w->w...(peut-on dire que 'c est dc tu type string si a la 2eme il s'agit de string aussi??)

    5ème: on obtient un second resultat du type 'c: v->v
    or il sagit du meme typage que dans 4, dou 'c=string??

    6eme: on a tes=baie (pb de variable car baie nest pas definie, non???)

    7eme: on obtient un resultat, il s'agit d'une fct gros curryfiee (pb de typage car avt gros etait def comm une liste??)

    8eme un resultat
    rixe est un float dou 'b=float

    voila ce que jai fait mais ce nest pas clair dans ma tete, je narrive pas a trouver 'a et ne suis pas sur pr 'c.

    POur la question 2, je ne comprend meme pas lenoncé!
    Faut-il trouver le typage de baie et haubert??
    dans ce cas, (selon moi) baie est du meme type que tes
    quant a haubert, il fait partie de la fonction curryfiee gros(haubert rixe), cela signifie-t-il qu'il sagit du eme type que rixe???

    Merci de m'aider car (comme vous le constatez jai vraiment bcp de mal!!)

  5. #5
    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
    Citation Envoyé par ficarre
    1ere ligne: on définit une fct recursicve hase qui possede 2 variables tes et rixe. avec 'a->'b->'c
    ok

    Citation Envoyé par ficarre
    2ème: gros est une liste a 2 éléments (mais je narrive pas a ded le typage a ce niveau..ce n'est pas string car il n'y a pas de ""??)
    Relis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Let gros [bon ; homme] =
    est différent de :
    Let gros = [bon ; homme]
    Le premier est donc une fonction, qui prend en argument une liste à deux éléments (c'est très moche, cf question 3).

    je ne sais pas quoi deduire de la 3eme ligne.
    On en déduit que les 2 variables sont de mêmes types... mais on le savait déjà, en fait.

    4ème: on ibtient un resultat du type w->w...(peut-on dire que 'c est dc tu type string si a la 2eme il s'agit de string aussi??)
    En effet...
    5ème: on obtient un second resultat du type 'c: v->v
    or il sagit du meme typage que dans 4, dou 'c=string??
    Oui.

    6eme: on a tes=baie (pb de variable car baie nest pas definie, non???)
    D'après la question 2, il y a deux identifiants globaux. baie en est donc un.
    Que déduis-tu du test d'égalité ?

    7eme: on obtient un resultat, il s'agit d'une fct gros curryfiee (pb de typage car avt gros etait def comm une liste??)
    Non, relis.

    8eme un resultat
    rixe est un float dou 'b=float
    Qu'en est-il de 'a ? Quel est le type de la fonction int_of_string ?


    POur la question 2, je ne comprend meme pas lenoncé!
    Faut-il trouver le typage de baie et haubert??
    Oui.

  6. #6
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    6eme: on a tes=baie (pb de variable car baie nest pas definie, non???)

    D'après la question 2, il y a deux identifiants globaux. baie en est donc un.
    Que déduis-tu du test d'égalité ?


    On en deduit qu'ils st du meme type, c tt non,?


    7eme: on obtient un resultat, il s'agit d'une fct gros curryfiee (pb de typage car avt gros etait def comm une liste??)

    Non, relis.


    il ne s'agit pas de currification mais vu que gros doit comporter 2 elements [..;..] je ne comprends tjrs pas!!

    8eme un resultat
    rixe est un float dou 'b=float

    Qu'en est-il de 'a ? Quel est le type de la fonction int_of_string ?


    on rappelle la fct hase
    comme 'a->float->string et que (rixe/.2007) est un float on en ded que 'a est du type de (int_of_float rixe) c'est a dire un entier??

    on a donc au final 'a->'b->'c
    cad int->float->string!!

    QUESTION 2
    baie=tes d'ou meme type dc int?

    gros(haubert rixe) forme une fonction à deux éléments (mais je ne sais pas si les 2 elements doivent etre du meme type??)
    si oui, haubert est du type string??

    QUESTION 3:
    la fonction est "lourde" a cause de la definition gros[bon;homme], faut-il decomposer (si oui je ne vois pas comment!!)

    merci bcp de maider, je comprends peu a peu!!

  7. #7
    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
    Citation Envoyé par ficarre
    il ne s'agit pas de currification mais vu que gros doit comporter 2 elements [..;..] je ne comprends tjrs pas!!
    Bon, c'est un peu inhabituel comme notation.
    D'une manière générale, le let fonctionne comme du pattern matching, mais avec un seul motif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let f [a; b] = ...
    est équivalent à :
    let f x = match x with [a; b] -> ...
    Ce qui est moche donc, c'est que le motif ne couvre pas tous les cas. Normalement, le compilateur donne un warning pour ça. Dans l'idéal, quand on utilise un type, il faut que ce type couvre toutes les valeurs dont on a besoin (normal), mais seulement celles-là (c'est important pour la sûreté).

    Il faudrait donc remplacer ce type par un type plus adapté...


    on a donc au final 'a->'b->'c
    cad int->float->string!!
    Gagné !

    baie=tes d'ou meme type dc int?
    Gagné !

    gros(haubert rixe) forme une fonction à deux éléments (mais je ne sais pas si les 2 elements doivent etre du meme type??)
    si oui, haubert est du type string??
    haubert ne peut pas être de type string. Réfléchis.

  8. #8
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    D'une manière générale, le let fonctionne comme du pattern matching, mais avec un seul motif.


    Code :
    let f [a; b] = ...
    est équivalent à :
    let f x = match x with [a; b] -> ...Ce qui est moche donc, c'est que le motif ne couvre pas tous les cas. Normalement, le compilateur donne un warning pour ça. Dans l'idéal, quand on utilise un type, il faut que ce type couvre toutes les valeurs dont on a besoin (normal), mais seulement celles-là (c'est important pour la sûreté).

    Il faudrait donc remplacer ce type par un type plus adapté...


    oula alors désolé mais je ne comprends absolument pas ce que cela signifie (je viens seulement de commencer l'info!) qu'est ce que le "pattern matching" ni que signifie le warnig (attention?!!)...je suis vraiment désolé!

    quant au typage d'Haubert, pourquoi ne peut-il pas etre string??

    désolé pour mon incompetence en caml..et merci pour votre aide!

  9. #9
    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
    warning = avertissement.
    C'est quand le compilateur prévient qu'on fait quelque de mal (sans pour autant provoquer une erreur de compilation).

    Pour le pattenr matching, tant pis. Tu verras ça plus tard, ce n'est pas important pour le moment.

    quant au typage d'Haubert, pourquoi ne peut-il pas etre string??
    haubert est une fonction...

  10. #10
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ficarre
    quant au typage d'Haubert, pourquoi ne peut-il pas etre string??
    (attention, pas constructif)
    Parce que t'as déjà vu qqun porter un haubert avec un string toi ?


    voilà, désolé, j'le referai plus, j'ai pas pu m'en empêcher :°D
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  11. #11
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    merci...mais je narrive pas a comprendre pourquoi haubert est nue fonction

    par ailleurs, pour la question 3, il aurait ete preferable de considerer la fct grops comme une fct recursive non??

  12. #12
    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
    gros n'est absolument pas récursive.

    haubert est une fonction parce qu'on lui donne un argument (rixe).

Discussions similaires

  1. typage en Caml Light
    Par Bool1988 dans le forum Caml
    Réponses: 4
    Dernier message: 30/08/2007, 16h14
  2. pb pour forcer un typage avec caml-light
    Par Moi_Emilie dans le forum Caml
    Réponses: 24
    Dernier message: 19/04/2007, 09h40
  3. [Caml Light] Librairie 'graphics" et Linux
    Par paf le chiot dans le forum Caml
    Réponses: 11
    Dernier message: 16/03/2007, 18h16
  4. Réponses: 3
    Dernier message: 07/12/2006, 10h15
  5. [Interface Graphique] Totalement perdu :-(
    Par Donut Man dans le forum MFC
    Réponses: 5
    Dernier message: 26/07/2005, 18h40

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