A combinator combines smaller computational elements into a larger computation of the same general kind. This makes it useful for building expressive functional interfaces and embedded domain-specific languages from precise operations that each do one small thing. section 5.1.1 section 13.2
The design problem is how to express domain behavior without exposing a collection of unrelated operations. A combinatorial interface addresses it by letting operations join into a larger combinator, while functional eDSLs use the same approach to make behavior concise, generic, safe, and expressive. section 5.1.1 section 13.2
Composing effectful operations
Generic functions such as mapM, sequence, and replicateM demonstrate the pattern: each accepts an operation or collection of operations and combines them into a larger effectful computation. Similar designs appear in lenses and reactive streams, where operations compose rather than stand alone. section 5.1.1 section 13.2
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) replicateM :: Applicative m => Int -> m a -> m [a]
Inspect representative Haskell combinators for mapping, sequencing, and repeating effectful computations. section 5.1.1



