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 :

Petite question sur les types.


Sujet :

Caml

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Petite question sur les types.
    Bonjour,
    Qu'est-ce qu'un type forcé en Caml?
    Cordialement

  2. #2
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    Bonjour,

    Où as-tu lu ça ? Dans quel contexte ?

    Le terme ne m'évoque pas quelque chose en particulier.

    On peut parler de forcer le type d'un terme quand on écrit une signature de type pour essayer de forcer le polymorphisme ou le monomorphisme.

    On peut parler de forcer une valeur paresseuse, auquel cas le type forcé serait le type normal, non-paresseux.

    Mais peut-être qu'il y a un autre usage de l'adjectif forcé qui m'échappe.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Voici un exemple simple pour comprendre facilement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # [];; (* liste polymorphique *)
    - : 'a list = []
    # ([] : int list);;
    - : int list = [] (* liste monomorphique (typage forcé) *)

  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
    On peut ajouter des annotations à un terme pour obtenir un type moins général qu'il ne serait inféré sinon. Mais quelle est ta question, au juste ?

  5. #5
    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
    Bonsoir,

    Et une question subsidiaire : si, éventuellement, tu souhaites réduire le niveau de généralité du typage d'un code OCaml, c'est que tu dois avoir de bonnes raisons de le faire. Je dis ça parce que, de façon générale, on essaie justement de gagner en généralité pour factoriser le code.

    Cordialement,
    Cacophrène

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    Et une question subsidiaire : si, éventuellement, tu souhaites réduire le niveau de généralité du typage d'un code OCaml, c'est que tu dois avoir de bonnes raisons de le faire. Je dis ça parce que, de façon générale, on essaie justement de gagner en généralité pour factoriser le code.
    Personnellement, je vois deux raisons :
    - utiliser des types "abréviations". Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type t = int list
    let empty = ([] : t)
    Notamment à l'intérieur des foncteurs ou des objets, on veut un type abstrait (non affecté ans le *.mli) que l'on nomme 't'. On veut également que toutes les opérations qui utilisent ce type opèrent bien sur ce type 't', et non, pour reprendre mon exemple précédent, le type 'int list'.

    - garantir des données valides, sur un module en amont

    En effet, si on souhaite écrire un module contenant des fonctions qui opèrent sur des éléments donnés par un code en aval, on souhait avoir la garantie d'une bon typage.
    Ce cas de figure est arrivé lorsque je voulais faire un module qui appelait deux autres modules : ces modules étaient écrits par des candidats qui implémentaient une IA à travers des fonctions appelées depuis mon module, qui s'occupe d'héberger la partie et de faire confronter les deux IA.

    Bien sûr, l'intérêt du typage forcé ne s'arrête pas là, mais sont exposés ci-dessus les deux cas qui m'arrivent personnellement le plus souvent

  7. #7
    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
    En général on fait plutôt ces vérifications-là au niveau de l'interface du module (le fichier .mli ou la signature d'un sous-module), plutôt qu'en utilisant des annotations dans les termes.

  8. #8
    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
    Comme Cacophrène, j'essaie de gagner en généralité pour factoriser le code.
    Comme gasche, je préfère placer les restrictions de type au niveau de l'interface du module.
    Comme Ptival et gasche j'annote une variable/expression à l'aide d'un type ou bien je fourni un type explicite. Je force un type (transtypage) quand je programme dans un langage à typage laxiste.

    Malgré toutes ces précautions, dans le top-level, il peut rester encore deux cas où le typage doit être explicite.

    Cas n°1: OCaml ne voit pas une certaine propriété "évidente"

    OCaml ne voit pas que cmp est un ordre total sur 'a :

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let rec lexicographical (cmp:'a -> 'a -> int) l1 l2 =
      match l1,l2 with
      | [],[] -> 0
      | [],_ -> -1
      | _,[] ->  1
      | h1::t1,h2::t2 ->
          let c = cmp h1 h2 in
          if c = 0 then lexicographical cmp t1 t2
          else c

    Cas n°2: les nested-datypes et autre récursion polymorphe

    Ce qu'il ne faut pas faire :

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec f : 'a.'a -> 'a = fun x -> x 
    and g y = f 3

    Ce qu'il faut faire :

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let f = fun x -> x 
    and g y = f 3

    D'ailleurs voilà pourquoi il y a un mot clé rec : parce qu'il ne faut pas en abuser.
    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.

  9. #9
    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
    Je ne comprends pas le cas 1. On gagne en flexibilité en laissant "lexicographical" utiliser deux types différents, d'ailleurs on utilise dans certaines situations un ordre lexicographique comme un produit de deux ordres différents.

    Enfin, ça permet de repérer des bugs. Si tu avais écrit (cmp h1 h1) par erreur, tu aurais repéré un typage plus restreint qu'attendu.

Discussions similaires

  1. petite question sur les types de champs
    Par charlie koller dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2007, 17h57
  2. Petites question sur les onglets...
    Par jarod_bx dans le forum Access
    Réponses: 1
    Dernier message: 20/12/2005, 18h45
  3. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  4. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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