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 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 >> 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 >>> 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 >>>> >>>> >>> >> >