packages feed

subcategories-0.1.0.0: README.md

# The `subcategories` package

This package provides variants of functor-like structures,
with domain types are constrained.
In particular, this package provides an abstraction for functorial
containers, which can be expressed as a functor from a *full-subcategory*
of **Hask** to **Hask** itself [^1].

For example:

- We can treat `Set` as if it is a `Fuctor`, `Foldable`, `Applicative`,
  with their domain restricted to full-subcategory **Ord** of `Ord` instances
  of **Hask**.
- For `MonoFoldable` or `MonoTraversable` types (from `mono-traversable` package),
  we provide `WrapMono` wrapper with zero-cost coercion. Such `mono`s can be
  regarded as a functorial structure from the full subcategory consisting of just a single object,
  say `Element mono`.

[^1]: Strictly speaking, `CFoldable`, a constrained counterpart of `Foldable`, doesn't require a functoriality as with the original `Foldable`.

## Optimisation
This library is designed to keep the abstraction runtime overhead as minimum as possible.

Some notes:

- If a constrained term such as `cmap` or `czipWith` has concrete type, it must have exactly the same representation as the corresponding operation modulo (zero-cost) coercion.
  * The same still holds if the set of required constraints coincides.
  * Although the constructor of `WrapMono mono a` is hidden, its just a `newtype`-wrapper around `mono`;
    hence, constrained operators must have the same representations as the corresponding combinators
    in `mono-traversable` package.
- OTOH, for a polymorphic term, like `cmap :: (Ord a, Ord b) => (a -> b) Set a -> Set b`
  and `Set.map`, they can have different representations; indeed, `Set.map` doesn't require `a` to be `Ord`-instance and therefore the implementation of `cmap` discards the dictionary for `Ord a` to call `Set.map`.