aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/monad.ml7
-rw-r--r--lib/monad.mli52
2 files changed, 35 insertions, 24 deletions
diff --git a/lib/monad.ml b/lib/monad.ml
index 7636b1630c..d4641194ee 100644
--- a/lib/monad.ml
+++ b/lib/monad.ml
@@ -24,6 +24,13 @@ module type Def = sig
end
+module type ListS = sig
+ type 'a t
+ val map : ('a -> 'b t) -> 'a list -> 'b list t
+ val map_right : ('a -> 'b t) -> 'a list -> 'b list t
+ val fold_right : ('a -> 'b -> 'b t) -> 'a list -> 'b -> 'b t
+ val fold_left : ('a -> 'b -> 'a t) -> 'a -> 'b list -> 'a t
+end
module type S = sig
diff --git a/lib/monad.mli b/lib/monad.mli
index 39d4056384..768fb739d3 100644
--- a/lib/monad.mli
+++ b/lib/monad.mli
@@ -25,38 +25,42 @@ module type Def = sig
end
-module type S = sig
+(** List combinators *)
+module type ListS = sig
- include Def
+ type 'a t
- (** List combinators *)
- module List : sig
+ (** [List.map f l] maps [f] on the elements of [l] in left to right
+ order. *)
+ val map : ('a -> 'b t) -> 'a list -> 'b list t
- (** [List.map f l] maps [f] on the elements of [l] in left to right
- order. *)
- val map : ('a -> 'b t) -> 'a list -> 'b list t
+ (** [List.map f l] maps [f] on the elements of [l] in right to left
+ order. *)
+ val map_right : ('a -> 'b t) -> 'a list -> 'b list t
- (** [List.map f l] maps [f] on the elements of [l] in right to left
- order. *)
- val map_right : ('a -> 'b t) -> 'a list -> 'b list t
+ (** Like the regular [List.fold_right]. The monadic effects are
+ threaded right to left.
- (** Like the regular [List.fold_right]. The monadic effects are
- threaded right to left.
+ Note: many monads behave poorly with right-to-left order. For
+ instance a failure monad would still have to traverse the
+ whole list in order to fail and failure needs to be propagated
+ through the rest of the list in binds which are now
+ spurious. It is also the worst case for substitution monads
+ (aka free monads), exposing the quadratic behaviour.*)
+ val fold_right : ('a -> 'b -> 'b t) -> 'a list -> 'b -> 'b t
- Note: many monads behave poorly with right-to-left order. For
- instance a failure monad would still have to traverse the
- whole list in order to fail and failure needs to be propagated
- through the rest of the list in binds which are now
- spurious. It is also the worst case for substitution monads
- (aka free monads), exposing the quadratic behaviour.*)
- val fold_right : ('a -> 'b -> 'b t) -> 'a list -> 'b -> 'b t
+ (** Like the regular [List.fold_left]. The monadic effects are
+ threaded left to right. It is tail-recursive if the [(>>=)]
+ operator calls its second argument in a tail position. *)
+ val fold_left : ('a -> 'b -> 'a t) -> 'a -> 'b list -> 'a t
+
+end
- (** Like the regular [List.fold_left]. The monadic effects are
- threaded left to right. It is tail-recursive if the [(>>=)]
- operator calls its second argument in a tail position. *)
- val fold_left : ('a -> 'b -> 'a t) -> 'a -> 'b list -> 'a t
+module type S = sig
+
+ include Def
- end
+ module List : ListS with type 'a t := 'a t
end