A monad is a fancy word for a generic type of the form MyMonad<T>
(a generic type of arity 1).
A monad is special because it adds 'special powers' to the T
that it wraps.
These 'special powers' won't sound very special to an imperative programmer, so you have to squint to see them but bear with me.
IEnumerable<T>
is a monad that gives values of type T
the special power of nondeterminism, or the ability to 'be' multiple values at once.
Nullable<T>
is a monad that gives values of type T
the special power of nullability, or the ability to be absent.
Task<T>
is a monad that gives values of type T
the special power of asynchronicity, or the ability to be used before they are computed.
The trick with monads comes when you want to play with the T
values, because they are inside another type. C# introduced language changes to make dealing with values inside these monads easier: