Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/06/2012, 18h59   #1
carlesup3
Invité de passage
 
Homme Ayoub
Étudiant
Inscription : mars 2012
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Ayoub
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mars 2012
Messages : 5
Points : 0
Points : 0
Par défaut Petite question sur les types.

Bonjour,
Qu'est-ce qu'un type forcé en Caml?
Cordialement
carlesup3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 11h04   #2
Ptival
Membre actif
 
Avatar de Ptival
 
Homme Valentin Robert
Étudiant
Inscription : juin 2004
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Valentin Robert
Âge : 24
Localisation : Etats-Unis

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 70
Points : 172
Points : 172
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.
Ptival est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 18h22   #3
jurik42
Invité régulier
 
Homme Victor Santet
Étudiant
Inscription : juillet 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Victor Santet
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 4
Points : 5
Points : 5
Voici un exemple simple pour comprendre facilement :

Code :
1
2
3
4
# [];; (* liste polymorphique *)
- : 'a list = []
# ([] : int list);;
- : int list = [] (* liste monomorphique (typage forcé) *)
jurik42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 19h00   #4
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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 ?
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2012, 20h23   #5
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 09h24   #6
jurik42
Invité régulier
 
Homme Victor Santet
Étudiant
Inscription : juillet 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Victor Santet
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 4
Points : 5
Points : 5
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 :
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
jurik42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 13h32   #7
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 16h56   #8
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
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 :
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 :
1
2
3
let rec f : 'a.'a -> 'a = fun x -> x 
and g y = f 3

Ce qu'il faut faire :

Code OCaml :
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: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 19h43   #9
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web