caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Foncteurs polymorphes
@ 1997-08-25 16:52 Hugo Herbelin
  1997-08-27 16:30 ` Jerome Vouillon
  1997-08-28  9:34 ` Emmanuel Engel
  0 siblings, 2 replies; 3+ messages in thread
From: Hugo Herbelin @ 1997-08-25 16:52 UTC (permalink / raw)
  To: caml-list

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2971 bytes --]

[ Can we have polymorphism both at function level and at functor level? ]

  Bonjour,

  encore une question sur les modules et le polymorphisme...

  Si j'ai bien compris, il n'y a pas de polymorphisme de foncteur mais
seulement du polymorphisme de fonction. Autrement dit, un foncteur comme

    module Toto (Tutu : sig val f : 'a -> 'a end) = 
    struct
      let tata x = Tutu.f x
      let titi x = Tutu.f [x]
    end

n'est pas polymorphe, seules le sont les fonctions tata et titi, et
chacune de manière indépendante. Autrement dit, en rendant explicite
les quantifications par des variables de type, le type du foncteur est

    module Toto :
      functor(Tutu : sig val f : FORALL 'a. 'a -> 'a end) ->
        sig
          val tata : FORALL 'a. 'a -> 'a
          val titi : FORALL 'a. 'a -> 'a list
        end

où "FORALL 'a." désigne la quantification universelle.


  Cela tient-il la route d'avoir une notion de polymorphisme dans les
modules qui soit distincte du polymophisme des fonctions qu'il
contient.

  Exemple pratique : le foncteur Set.Make.

  Pourrait-on avoir les types suivants pour le module Set :

    module type 'a OrderedType =
      sig
        val compare: 'a -> 'a -> int
      end

    module type 'a S =
      sig
        type 'a t
        val empty: 'a t
        ...
     end

    module Make(Ord: 'a OrderedType) : 'a S

où la quantification par 'a est maintenant sur Make (i.e. Make a le
type explicitement quantifié "FORALL 'a. 'a OrderedType -> 'a S")


  Intérêt : on peut appliquer Make aussi bien à la structure

    struct let compare = Pervasives.compare end

et obtenir un module polymorphe de type ('a S), qu'à la structure (par exemple)

    struct let compare = (-) end

et obtenir un module polymorphe de type (int S)

  Cela simplifierait aussi le fichier hashtbl de la stdlib, permettant
d'avoir un unique foncteur polymorphe plutôt qu'un foncteur
monomorphe paramétrable par l'égalite + un module polymorphe
forcément basé sur (=).

  Si les foncteurs pouvait être polymorphes, cela compliquerait sans
doute le typage, puisqu'il faudrait sûrement faire de l'unification
pas seulement pour typage des fonctions mais aussi pour le typage
des modules, et qu'il y aurait deux sortes de quantifications des
variables de types des fonctions membres de module.


  Cependant, l'actuelle non-possibilté d'avoir des foncteurs
polymorphes me semble -- naïvement -- d'autant moins impossible que
pour les classes, c'est l'inverse :

  Dans l'exemple suivant, 

    class ('a) toto (f:'a -> 'a) =
      val f=f  
      method tata x = f x
      method titi x = f [x]
    end;;

la quantification est forcément sur la classe, imposant donc le type suivant

    class 'a toto ('a -> 'a) =
      constraint 'a = 'b list
      val f : 'a -> 'a
      method tata : 'a -> 'a
      method titi : 'b -> 'a
    end

où les fonctions ne sont pas indépendamment polymorphes.

                                                  Hugo





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Foncteurs polymorphes
  1997-08-25 16:52 Foncteurs polymorphes Hugo Herbelin
@ 1997-08-27 16:30 ` Jerome Vouillon
  1997-08-28  9:34 ` Emmanuel Engel
  1 sibling, 0 replies; 3+ messages in thread
From: Jerome Vouillon @ 1997-08-27 16:30 UTC (permalink / raw)
  To: Hugo Herbelin; +Cc: caml-list


On Mon, 25 Aug 1997, Hugo Herbelin wrote:

> Cela tient-il la route d'avoir une notion de polymorphisme dans les
> modules qui soit distincte du polymophisme des fonctions qu'il
> contient.

Cela a effectivement un sens, et a d'ailleurs ete deja propose par
Stefan Kahrs (http://www.dcs.ed.ac.uk/home/smk/).

Cependant, pour assurer la correction du typage en presence d'effets
de bords, la technique utilisee par O'caml est de ne generaliser le
type que des expressions qui sont syntaxiquement des valeurs (toutes
les autres techniques compliquent le systeme de type). La quantifi-
cation du type des modules perd beaucoup de son interet si l'on
generalise cette technique aux expressions de module. Ainsi, dans ton
exemple, le module defini par
   module M = Make(struct let compare = Pervasives.compare end)
aurait le type '_a S et non 'a S. En particulier, le type de M.empty
est '_a t, qui n'est pas polymorphe.

-- Jerome Vouillon

>   Exemple pratique : le foncteur Set.Make.
> 
>   Pourrait-on avoir les types suivants pour le module Set :
> 
>     module type 'a OrderedType =
>       sig
>         val compare: 'a -> 'a -> int
>       end
> 
>     module type 'a S =
>       sig
>         type 'a t
>         val empty: 'a t
>         ...
>      end
> 
>     module Make(Ord: 'a OrderedType) : 'a S
> 
> où la quantification par 'a est maintenant sur Make (i.e. Make a le
> type explicitement quantifié "FORALL 'a. 'a OrderedType -> 'a S")






^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Foncteurs polymorphes
  1997-08-25 16:52 Foncteurs polymorphes Hugo Herbelin
  1997-08-27 16:30 ` Jerome Vouillon
@ 1997-08-28  9:34 ` Emmanuel Engel
  1 sibling, 0 replies; 3+ messages in thread
From: Emmanuel Engel @ 1997-08-28  9:34 UTC (permalink / raw)
  To: Hugo Herbelin; +Cc: caml-list

Pour ton probleme de foncteur polymorphe, tu peut trouver une 
partie de la solution dans un de mes precedent messages a la 
mailling liste. Je ne le trouve pas dans l'archive, voici une 
copie de la partie interessante:


:
:
Question:
    Existe-t-il un moyen simple et rapide a l'aide du foncteur 
  Set.Make de creer des ensembles polymorphes qui utilisent une
  fonction de comparaison generique (Pervasives.compare par exemple) ??

  eg 

  module GeneriqueSet = Set.Make(struct ?????? end)

Il me semble que non et, que cette impossibilite est plus due a la facon 
dont est declare le foncteur qui permet de construire les ensembles qu'a 
une vraie limite du systeme; voici une version legerement differente de
ce foncteur qui me permet une telle manip:

module Make(S:sig type 'a t val compare : 'a t -> 'a t -> int end)=
  (struct
     type 'a elt = 'a  S.t
     type 'a set = ('a elt) list
     let empty = []
     and mem = List.mem
     and add e s = e::s
  end:sig
        type 'a elt = 'a S.t
        and 'a set
        val empty : 'a set
        val mem : 'a elt -> 'a set -> bool
        val add : 'a elt -> 'a set -> 'a set
      end);;


module IntSet = Make(struct type 'a t = int let compare = (compare:int
-> int -> int) end);;
module GenericSet = Make(struct type 'a t = 'a let compare = compare
end);;


------- fin du message

Je suis bien d'accord que cette version, meme si elle permet un peut
plus
de liberte que le version actuelle n'est pas aussi generale que des
foncteurs 
"polymorphes". Par exemple, je ne peut pas definir

module PSet = Make(struct type ('a,'b)t = 'a * 'b let compare (x,_)
(y,_) = compare x y end);;

alors qu'avec l'extension que tu propose cela serait a prioris possible.
Toutefois 
il me semble que de serieux problemes se profillent a l'horizon avec une 
telle extension; en ocaml les foncteurs sont d'ordre superieur et tu
veut pouvoir
lier les variables a n'importe quel niveaux. Cela ressemble furieusement
au systeme F. 
Et la je ne suit meme pas sur que le sous typage sous decidable (ie
decider si F(X) 
est valide implique de verifier F : S1 -> S2, X : S3 et S1 <: S3 ).
                                                        ^^^^^^^^
 
-- 

- Emmanuel Engel




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~1997-08-28  9:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1997-08-25 16:52 Foncteurs polymorphes Hugo Herbelin
1997-08-27 16:30 ` Jerome Vouillon
1997-08-28  9:34 ` Emmanuel Engel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).