Many of these concepts are so hidden in Haskell code that it’s easier to list examples that don’t use them (provided that you can find them). Every Haskell program uses monads, at least for IO.
All of them are widely used because they are abstractions that very often appear in code. Consider functors: mapping by container is a fairly common need, so it makes sense to have a single interface for any data structure similar to a container, and this is what Functor provides. It happens that even the concept of “container” is more specific than an abstraction of a functor, but, hopefully, this demonstrates meaning.
Monads: XMonad window manager is a widely used program that makes extensive use of monad transformers and lightning structure . STM is a library that provides a new monad with useful properties.
Monoids: Sequence structure in containers package is implemented with monoids . In addition, monoids are widely used for modeling sets, lists, etc., since two monoid operations provide empty list and concatenation (or empty set and concatenation).
Arrows: Yampa and HXT (Haskell XML Toolbox) immediately come to mind.
Functors appear everywhere. For monadic code, quite often there are many <$> s, which means that a Functor instance is used. Most Haskell parsers use functors.
source share