So let’s say I have a module A with the following signature
module A : sig
type t
val foo : t -> input -> output
val bar : t -> input -> output
end
Also, I have an arbitrary monad module M, that has the following type type 'a t.
Now I would like to create a module B such that it maps the signatures of the functions in the following way:
module B: sig
type t
val foo : t M.t-> input -> output M.t
val bar : t M.t -> input -> output M.t
end
Is there a nice way to do this in OCaml? I don’t think you can use regular functors to do this because they require you to know the name of each function.
Not within the type system. First of all, OCaml doesn’t support the kind of type-level compuation you’d need to turn 'a -> 'b -> 'c into 'a 't -> 'b -> 'c 't. Then you’d need some functor that could iterate over its argument’s vals to apply this function, which I don’t think is possible in any language with ML-like modules.
You could probably write a ppx to generate all the code automatically, but IMO that’s more trouble than it’s worth and it’s better to just do it manually as @Juloo suggested above.
It’s probably not central to your problem: there is no way to create a value of A.t because t is abstract and none of the functions in A are creating such a value.