En Ocaml, le code de base ne me pose pas de problème, si tu joues avec les modules et leur définition et un gadt au milieu, je vais beaucoup transpirer.
Qu'est-ce qui te pose problème avec les modules ? Ce sont juste des enregistrements (tout comme les objets) avec des déclarations de type (pas comme les objets : les modules c'est des objets sous stéroïdes). Exemples :
(* un point en 2D vu comme un enregistrement *)typept_2D={x:float;y:float}(* un point en 2D vu comme un objet *)classtypeobj_pt_2d=objectmethodx:floatmethody:floatend(* un point en 2D vu comme un module *)moduletypemod_pt_2D=sigvalx:floatvaly:floatend(* une valeur pour chaque type représentant le même point *)letrp:pt_2D={x=1.0;y=2.0}letop:obj_pt_2d=objectmethodx=1.0methody=2.0endmoduleMP:mod_pt_2D=structletx=1.0lety=2.0endrp.x=op#x&&rp.y=op#y&&rp.x=MP.x&&rp.y=MP.y;;-:bool=true
Contrairement aux enregistrements, on peut étendre les objets et modules par héritage :
mais seuls les modules peuvent contenir des déclarations de type, ce qui rend le concept plus abstrait, c'est à dire plus générique. ;-)
moduletypePoint_2D_t=sig(* type des coordonnées *)typet(* coordonnées du point *)valx:tvaly:tend(* les annotations de type ne sont pas nécessaires, je les mets juste pour souligner qu'ils réalisent la signature *)modulePt_float:Point_2D_twithtypet=float=structtypet=floatincludeMPendmodulePt_int:Point_2D_twithtypet=int=structtypet=intletx=1lety=2end
On pourrait faire la même chose en utilisant un enregistrement paramétrique : généricité sur les enregistrements (avec les objets, ça marche aussi).
Mais là où seuls les modules peuvent exprimer un tel degré de généricité, c'est lorsque le type déclaré dans le module est lui-même paramétrique.
moduletypePar=sigtype'attypeuvalv:utendmoduleM:Parwithtype'at='alistandtypeu=string=structtype'at='alisttypeu=stringletv=["Hello World !"]endmoduleN:Parwithtype'at='aoptionandtypeu=int=structtype'at='aoptiontypeu=intletv=Some1end
Les modules permettent de pousser la généricité du code à un niveau inaccessible aux enregistrements et aux objets.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.
[^] # Re: go 2.0
Posté par kantien . En réponse au journal Pourquoi la recherche en langages de programmation ?. Évalué à 2.
Qu'est-ce qui te pose problème avec les modules ? Ce sont juste des enregistrements (tout comme les objets) avec des déclarations de type (pas comme les objets : les modules c'est des objets sous stéroïdes). Exemples :
Contrairement aux enregistrements, on peut étendre les objets et modules par héritage :
mais seuls les modules peuvent contenir des déclarations de type, ce qui rend le concept plus abstrait, c'est à dire plus générique. ;-)
On pourrait faire la même chose en utilisant un enregistrement paramétrique : généricité sur les enregistrements (avec les objets, ça marche aussi).
Mais là où seuls les modules peuvent exprimer un tel degré de généricité, c'est lorsque le type déclaré dans le module est lui-même paramétrique.
Les modules permettent de pousser la généricité du code à un niveau inaccessible aux enregistrements et aux objets.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.