Browse thread
Variance problem in higher-order Functors?
-
Jacques Carette
-
Andreas Rossberg
-
Jacques Carette
- Jacques Garrigue
-
Jacques Carette
-
Andreas Rossberg
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2006-07-26 (05:17) |
From: | Jacques Garrigue <garrigue@m...> |
Subject: | Re: How do I achiece this, was Re: [Caml-list] Variance problem in higher-order Functors? |
From: Jacques Carette <carette@mcmaster.ca> > In other words, I want to be able to define > module type Trans = functor(U:UPDATE) -> functor(D:DOMAIN) -> sig ... end > but none of my attempts have worked, even though the first-order code I think I have a solution, at least to your first post. If I am right, what you need is to express that Bar's 2nd parameter is a functor with input of type "DOMAIN with type kind = D.kind". But you cannot use "with", because the functor type is defined as an abrreviation. The trick is to wrap the module type definition in a functor, and to use applicative types. (* If we go higher order: *) module UPDATE2(D0:DOMAIN) = struct module type S = functor(D:DOMAIN with type kind = D0.kind) -> sig type obj = D.foo val update : obj -> obj end end (* this is the same as the "updates" above, just wrapped in a module *) module Bar(D:DOMAIN)(U:UPDATE2(D).S) = struct module U = U(D) let update x = U.update x end (* works as there are no restrictions *) module T3 = Bar(Integer)(BadUpdate) ;; (* and now this works! *) module T2 = Bar(Rational)(DivisionUpdate) ;; This trick of wrapping module types inside functors proves useful in many situations, when you want to express sharing that cannot be expressed by with alone. Jacques Garrigue