I've created a gist at https://gist.github.com/anonymous/cbfe96b920f08208e1dc to illustrate the problem. I can't get  InnerBag to unify with the ValueBag. This is a very sparse representation of the code, but it contains all the essential elements in one file, so you can just try to build it with ocamlc.

Thanks in advance
Yotam


On Thu, Sep 4, 2014 at 5:59 PM, Yotam Barnoy <yotambarnoy@gmail.com> wrote:
Thanks for the reply Gabriel. I can't post the code at this time -- not without leaving out a whole bunch of it, in which case getting it to compile will be difficult. The pattern should be clear enough, though: ocaml uses functors for all complex persistent data structures, and if I have a Map.Make(something), and then another functorized module that contains Map.Make(something), there should be a way to unify the outer and inner Map. That's basically my situation, but ocaml refuses to unify the two Map applications.

Also, there are also very few resources online about complex uses of functors. Almost every resource touches trivial uses and then moves on to other subjects.


On Thu, Sep 4, 2014 at 11:12 AM, Gabriel Scherer <gabriel.scherer@gmail.com> wrote:
(voluntarily private reply)

Could you send a self-contained source code that can be compiled (.. and maybe raise a type error)? Your code above is good but there are ellipsis that people maybe don't want to have to fill themselves to experiment with your problem.


On Thu, Sep 4, 2014 at 3:53 PM, Yotam Barnoy <yotambarnoy@gmail.com> wrote:
Here's an attempt to clarify the question:

I have a functor F and a functor G. I apply F to module M outside of G to create F', and within G I also apply F to M to create F''. Additionally, G is applied to M to create G'. How do I make the compiler understand that F' outside G' is the same as F'' inside G'?

Yotam


On Wed, Sep 3, 2014 at 1:20 PM, Yotam Barnoy <yotambarnoy@gmail.com> wrote:
Working with ocaml's functional data structures has quickly become a job of connecting different functors together, and I'd appreciate some help.

I have the following layout:

module rec OrderedKey : OrderedKeyType = struct
    type t = Value.value_t
    let compare = compare
    let filter_idxs idxs = function
      | Value.VTuple l -> Value.VTuple(list_filter_idxs idxs l)
      | _ -> invalid_arg "not a vtuple"
    end

and ValueBag : IBag.S with type elt = Value.value_t =
  IBag.Make(OrderedKey)

and ValueMMap : IMultimap.S with type elt = Value.value_t and type bag = ValueBag.t =
  IMultimap.Make(OrderedKey)

and Value : sig ... type value_t = ... end = Value

The situation is as such: my multimap (IMultimap) contains an internal specialization of the IBag functor called an InnerBag. It attempts to return said bag, which is equivalent to the external ValueBag in structure. However, I don't know how to tell ocaml that the type 'bag' which is abstract in IMultimap is exactly the same as the external ValueBag. I tried to do that above, but what I get is a mismatch between IMultimap's internal InnerBag.t and the external ValueBag.t.

Any help would be appreciated.

Yotam