Apply - used to facilitate default behavior for monad transformers NOTE: Don't rely on this, it may not be a permanent addition to the project
Used for double dispatch by the bind function for monadic types that need to construct an output value/state (like MState and MWriter). For all other monad types just return mb.
Produce a monad of MA in it's failed state
The Id function allows the Bind function to construct a monad from a function rather than MA. It's a form of double-dispatch like the BindReturn function. It hands context to the type that knows how to construct. This facilitates the unification of Monads that take arguments (like Reader, State, etc.) with ones that don't (Option, Try, Writer, Lst, Either, etc.)
The IdAsync function allows the Bind function to asynchronously construct a monad from a function that returns a Task<MA> rather than MA. It's a form of double-dispatch like the BindReturn function. It hands context to the type that knows how to construct. This facilitates the unification of Monads that are asynchronous in nature (like TryAsync, TryOptionAsync, Task) with ones that aren't (State, Reader, Writer, Option, Try, Lst, Either, etc.)
Associative binary operation
Lazy monad constructor function. Provide the bound value A to construct a new monad of type MA. This varies from the 'standard' construction of monadic types in that it takes an input parameter. This function allows monads that take parameters (like Reader and State) to be unified with non-parametric monads like (Option, Either, etc.), which take Unit as their input argument.
Neutral element (None in Option for example)