Until you get a better response, I can point you in a direction. You want to look up first-class modules . It looks like you will want something like this (taken from that page): let to_int m = let module M = (val m : X_int) in M.x Except yours will look more like: let find h ht x = let module H = (val h : Hashtbl.S) in H.find *ht* x Sorry about the awful formatting. On Tue, Jun 16, 2015 at 8:15 AM, Rémy El Sibaïe Besognet < remy.el-sibaie@lip6.fr> wrote: > Hi all, > > Considering this function > > let find ht x = > Hashtbl.find ht x > > > I would like to write a more general `find` function which takes the > module > as first class module in parameter with the possibility to use it on > different implentations of Hashtbl.S. > > let find (module H : Hashtbl.S) ht x = > H.find *ht* x > > > but it failed with this error (on the underlined identifier) : > > *Error: This expression has type 'a H.t but an expression was expected of > type 'a H.t The type constructor H.t would escape its scope* > > > > I also tried by specifying the implementation but had the same problem: > > let find (type a) (module H : Hashtbl.S with type key = a) (ht : 'a Ht.t) (x : a) = > > H.find ht x > > Anyone has an idea how to achieve this thing ? > > Thanks, > - Rémy El Sibaïe, LIP6 > > > > PS: at the begining, I was trying on a memoization function which has more > interest than the previous function : > > let memo_rec (module H : Hashtbl.S) h f = > let rec g x = > try H.find h x with > | Not_found -> > let y = f g x in > H.add h x y; y > in g > > -- Phil Eaton http://eatonphil.com