mono-traversable: Type classes for mapping, folding, and traversing monomorphic containers

[ data, library, mit ] [ Propose Tags ]

Monomorphic variants of the Functor, Foldable, and Traversable typeclasses. If you understand Haskell's basic typeclasses, you understand mono-traversable. In addition to what you are used to, it adds on an IsSequence typeclass and has code for marking data structures as non-empty.

[Skip to Readme]


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS],,,,,, 0.3.1, 0.4.0,,,,, 0.5.0, 0.6.0,,,,, 0.6.1, 0.6.2, 0.6.3, 0.7.0, 0.8.0,, 0.9.0,,, 0.9.1, 0.9.2,, 0.9.3, 0.10.0,, 0.10.1,, 0.10.2, 1.0.0,, 1.0.1,,,, 1.0.2,,,,,,,,,,,,,,,, (info)
Dependencies base (>=4.5 && <4.9), bytestring (>=0.9), comonad (>=3.0.3), containers (>=0.4), dlist (>=0.6 && <1.0), dlist-instances (>=0.1 && <0.2), hashable, semigroupoids (>=3.0), semigroups (>=0.10), text (>=0.11), transformers (>=0.3), unordered-containers (>=0.2), vector (>=0.10), vector-algorithms (>=0.6), vector-instances [details]
License MIT
Author Michael Snoyman, John Wiegley, Greg Weber
Revised Revision 2 made by HerbertValerioRiedel at 2016-02-16T08:48:16Z
Category Data
Home page
Source repo head: git clone git://
Uploaded by MichaelSnoyman at 2014-09-09T07:38:39Z
Distributions Arch:, Debian:, Fedora:, FreeBSD:, LTSHaskell:, NixOS:, Stackage:, openSUSE:
Reverse Dependencies 87 direct, 4569 indirect [details]
Downloads 120741 total (277 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for mono-traversable-0.6.2

[back to package description]


Type classes for mapping, folding, and traversing monomorphic containers. Contains even more experimental code for abstracting containers and sequences.

A polymorphin container is one such as list which has a type variable [a] A monomorphic container is one such as Text which has a type Text that does not expose the underlying characters.

Adding instances

If you have a data type which is a member of one of the relevant typeclasses (Functor, Foldable, Traversable), its quite easy to add an instance for MonoFunctor, MonoFoldable or MonoTraversable.

You just have to declare the proper type instance:

    {-# LANGUAGE TypeFamilies         #-}
    -- type instance Element T.Text = Char  -- already defined
    -- type instance Element [a] = a        -- here for example
    type instance Element (CustomType a) = a

And then, the needed instances:

    instance MonoFunctor (CustomType a)
    instance MonoFoldable (CustomType a)
    instance MonoTraversable (CustomType a)

in your code, and your ready to use CustomType a with the functions defined in this package.

Note: if your type is as monomorphic container without the proper typeclasses, then you will have to provide an implementation. However, this should be fairly simple, as it can be seen in the code

mono-traversable versuse lens Traversal

lens is a huge package with a lot of functionality. One piece of functionality it exposes is Fold and Traversal which can also be used to deal with monomorphic containers.

You could prefer mono-traversable to using this part of lens because

  • There is really no new API to learn. If you know Foldable, you can use MonoFoldable just as easily
  • mono-traversable's typeclass based approach means many methods are included in the class but can easily be given specialised optimized implementations
  • You don't need to explicitly pass around the Traversal

The last point is also a point of inflexibility and points to a use case where you could prefer using a lens Traversal. mono-traversable treats ByteString as a sequence of bytes. If you want to treat it as both bytes and characters, mono-traversable would require a newtype wrapper around ByteString, whereas a lens traversal would just use a different traversal function.

Build Status