Cat is a C++20 functional library inspired by category theory and Haskell language. The purpose of cat is to provide utility functions and type classes to enable the functional programming paradigm in C++.
The purpose of Cat library is twofold:
- to provide utility classes and functions that enable the functional programming paradigm in C++.
- to implement an extensible framework of type classes to attain a better reusability of code through the principles of category theory.
The Cat library:
-
is lightweight. Each function and object shipped with the library takes advantage of modern C++ features, such as
constexpr
constructs, movability, perfect forwarding, etc. -
is written in portable C++20 without macro black-magic, whereas template meta-programming is restricted only to the mechanics of type traits.
-
implements type traits tailored for generic and functional programming (e.g.
is_container
,is_associative_container
,function_type
,function_arity
,return_type
,is_callable
to mention a few). -
provides utilities, like callable wrappers, which enable functional composition and currying on-top-of any kind of callable types (including
std::bind
expressions and generic lambdas). -
provides functions that operate on
std::tuple
and generic containers. -
provides utilities that enable perfect forwarding from L/R value containers by means of
forward_as
andforward_iterator
. -
includes an extensible framework for building type classes and provides the implementation of the following ones:
- Functor
- Bifunctor
- Applicative
- Alternative
- Monoid
- Monad
- MonadPlus
- Foldable
- Show
- Read
- ...
-
includes instances of standard C++20 and Technical Specification (TS) containers/types for the above-mentioned type classes.
At the present moment the Cat library is tested under Linux and MacOS with both glibcxx and libc++ library and with the following compilers:
- clang 14.0
- clang 6.0
The Cat library takes inspiration from the following projects:
- The Haskell language
- Fit library by Paul Fultz II
- FTL library by Bjorn Aili