module Cat: CCCat
Signatures
module type MONOID = sig
.. end
module type FUNCTOR = sig
.. end
module type APPLICATIVE = sig
.. end
module type MONAD_BARE = sig
.. end
module type MONAD = sig
.. end
module type MONAD_TRANSFORMER = sig
.. end
type 'a
sequence = ('a -> unit) -> unit
Cheating: use an equivalent of "to List" with a sequence
module type FOLDABLE = sig
.. end
module type TRAVERSE = (
M
:
MONAD
)
sig
.. end
module type FREE_MONAD = sig
.. end
The free monad is built by nesting applications of a functor F
.
Some Implementations
module WrapMonad (
M
:
MONAD_BARE
)
: MONAD
with type 'a t = 'a M.t
Implement the applicative and functor modules from only return and bind
module MakeFree (
F
:
FUNCTOR
)
: FREE_MONAD
with module F = F
module MakeFreeFold (
FM
:
FREE_MONAD
)
(
Fold
:
FOLDABLE
with type 'a t = 'a FM.F.t
)
: FOLDABLE
with type 'a t = 'a FM.t