# Monads
## Basics
- In functional programming, a monad is a structure that combines program fragments (functions) and wraps their return values in a type with additional computation.
- In addition to defining a wrapping monadic type, monads define two operators:
- one to wrap a value in the monad type
- another to compose together functions that output values of the monad type (these are known as monadic functions).
- General-purpose languages use monads to reduce boilerplate code needed for common operations (such as dealing with undefined values or fallible functions, or encapsulating bookkeeping code).
- Functional languages use monads to turn complicated sequences of functions into succinct pipelines that abstract away control flow, and side-effects.
> Formal Definition: Monads is a monoid in a category of endofunctors.
Explanation:
- Functor: It is an object or value combined with a mechanism to do something with that value.
- Endofunctors: A subclass of functor which returns the object of same shape as the functor on which it is applied to.
- Example:
```python
class Functor:
def __init__(self, value):
self.value = value
def map(self, func):
return Functor(func(self.value))
```
- Here, the map function is an endofunctor because it returns the same type Functor on which it was ran.
- It preserves the structure after the operations.
- Monad: It is a specific type of endofunctor which is meant to preserve structure and composition.
## Resources
- [The Absolute Best Intro to Monads For Software Engineers](https://youtu.be/C2w45qRc3aU?si=dQ5TVmYOVneEmm1n)
- [Monads in Modern C++ - Georgi Koyrushki & Alistair Fisher - CppCon 2023](https://youtu.be/kZ8rbhGgtv4?si=IKziquVPDxqSah3z)
- [What the Heck are Monads?!](https://youtu.be/Q0aVbqim5pE?si=ElIsci9aV-BmG2gA)