Hi,

I'm trying to construct a module that have a function taking polymorphic arguments. I want to use this module as a local module in different places, where the function implementation is different. The module has the signature:

module type Foo_sig =
sig
 val foo : 'a -> 'a
end

If I have a function definition:

let foo_impl a =
 a

I'm allowed to write:
let _ = let module Foo : Foo_sig =
       struct
         let foo = foo_impl
       end
       in
          ()

However I want to have a function that creates the module and take the "foo_impl" as argument:
let test f =
 let module Foo : Foo_sig =
     struct
   let foo = f
     end
 in
   ()

and then later I would like to use it like:
let _ = test foo_impl

However, compiling it fails with:
Error: Signature mismatch:
Modules do not match: sig val foo : '_a end is not included in Foo_sig
      Values do not match:
        val foo : '_a
      is not included in
        val foo : 'a -> 'a

Is there some trick to force f to have ('a -> ')? I have tried with "let test (f : 'a -> 'a)" but then it complains that f has type ('_a -> '_a). Any other suggestions/design patterns for solving these situations, without rewriting the whole structure of the application, would also be highly appreciated.

Thanks,

Hans



_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to