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