Module Travesty.Traversable

Signatures and functors for containers and data structures that can be mapped across with a monadic side-effect.

Modules based on this pattern resembles the Haskell Traversable typeclass, but with two differences:

Signatures

For input and output module signatures for this module's functors, see Traversable_types.

Making traversable containers

Monadic traversal is sufficient to define fold, and, therefore, all of the key functionality for a Base-style container. As such, our signatures and functors subsume those for building containers.

New containers

module Make0 (I : Traversable_types.Basic0) : Traversable_types.S0 with module Elt = I.Elt and type t = I.t

Make makes an S0 from a Basic0.

module Make1 (I : Traversable_types.Basic1) : Traversable_types.S1 with type 'a t = 'a I.t

Make makes an S1 from a Basic1.

Extending existing containers with monadic traversals

Make0_container makes an S0 from a Basic0_container.

Make1_container makes an S1 from a Basic1_container.

Combining and modifying traversable containers

Chaining

Chain0 chains two S0 instances together, traversing each element of the outer instance with the inner instance.

Fixing the element type

module Fix_elt (I : Traversable_types.S1) (Elt : Base.Equal.S) : Traversable_types.S0 with module Elt = Elt and type t = Elt.t I.t

Fix_elt (I) (Elt) demotes an S1 S to an S0 by fixing the element type to that mentioned in Elt.

Helper functions

module Helpers (M : Base.Monad.S) : sig ... end

Utility functions for building traversals.