On Wed 05 Feb 2014 10:49:29 AM PST, Yotam Barnoy wrote:OCaml has functors but they don't support optional fields in their arguments.
Hello List
I would like the following feature, and I'm not enough of an expert in
module-fu to know if something like this is doable.
Suppose I have a module signature of
module type Monad = sig
type 'a m
val return : 'a -> 'a m
val (>>=) : 'a m -> ('a -> 'b m) -> 'b m
val (>>) : 'a m -> 'b m -> 'b m
end
I would like to have a default implementation for (>>), since a simple
default implementation is
let (>>) m f = m >>= fun _ -> f
Alternatively, I would like to include this from some DefaultMonad
module, but have the (>>=) referred to in the function be my newly
defined (>>=) implementation (ie. late binding). Is there currently
any way to do this? If not, would there be a way to implement a
partial default implementation built into or associated with a module
signature? Something like
You can create a functor Monad.Make that takes a module without (>>) and creates a module with an extra (>>) field. However, if the input module contains (>>) already, the new implementation will override it as in this minimal example:
# module A = struct end;;
module A : sig end
# module M(A: module type of A) = struct include A let x = 0 end;;
module M : functor (A : sig end) -> sig val x : int end
# module B = M(struct end);;
module B : sig val x : int end
# module C = M(struct let x = 1 end);;
module C : sig val x : int end
# C.x;;
- : int = 0
C.x is 0, not 1.
There may be clever tricks to support some kind of optional module field pattern, though. I'll let others scratch their heads. :-)
module type Monad = sig... default struct... end
Haskell has this available as part of the semantics of their typeclass
system, and I think it would be really handy to have (if there isn't
already a way to do it currently).
-Yotam