Module Monad.Collection

Container interface in the Kleisli category.

The module provides two interfaces for collections (containters) where functions return monadic computations instead of values.

As usual, two interfaces are provided:

The container interfaces can be derived for any collection that implements a base interface. In our case we have two versions of the base interfaces, Eager and Delay. The interfaces differ only in the type of the fold function. The Eager interface provides a regular fold function, while the Delay.fold is a more general variant of fold that is parametrized by a continuation.

If it is not possible to provide the generic version of fold, then all iterators will be implemented using continuations, (i.e., will use a constant stack size). However, the iterators that maybe short circuited (i.e., a computation may be determined without consulting all the elements), e.g., find, exists, etc, will still still fold through all the elements. This is especially problematic with infinite sequences. So if it is possible the delayed version of fold should be provided, especially in the case of infinite sequences.

module type Basic = sig ... end

Base signature for collections

module type Eager = sig ... end

A container with an eager (regular) fold.

module type Delay = sig ... end

A container with a generic fold

module type S2 = sig ... end

A container interface for a binary monad.

module type S = sig ... end

A container interface for an unary monad