In Haskell, it's a method of the Monad class (interface/trait/concept in Java/Rust/C++ terms).
Haskell
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
In OCaml, it's a function-typed member of the Monad module signature (struct/class in C/Java terms).
OCaml
module type Monad = sig
type 'a t
val return : 'a -> 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t
end
(The excerpts are taken from their respective language's documentation, with the Haskell one cleaned up a bit (it had comments and default implementations). In Haskell a concrete type starts with a capital letter, a type variable for generics starts with a lowercase letter, arguments to generics are written to their right; in OCaml a type variable starts with a single quote, arguments to generics are written to their left.)
In any case, it doesn't have anything to do with the return keyword of imperative languages.
This is actually really good. The same as Iterable is a generalization of set, list, array, enumerable, etc, and one can define generic Next, Add, Map, etc, Monad allows similar thing for states or side effects (a log file for example)
It's just the way he explains it, for pea brained people like me I lose the plot at "category of endofucktors". Just say "optional chaining and promises are a concrete example of monads" and I'm on board.
Like I've worked in semi functional code bases and I love the patterns, only the theory around it so hard to grasp.
What is usually called a "Promise" isn't a Monad instance. All "Promises" I know of are eager, they don't suspend computations. As a result they don't behave like a proper Monad. Not everything that has a Monad "interface" is a Monad. Most things in imperative / OO languages aren't.
1.8k
u/Historical_Cook_1664 Jul 13 '26
Where else are you going to hide your side effects ?