Does the chain function in underscore.js create a monad?
comonad, functional-programming, haskell, monads, underscore.js
Solution
No, not a monad, but a comonad! It turns a function that takes a wrapped object and returns a normal value into a function that both takes and returns a wrapped object. As a Haskell type signature that would be:
(Wrapped a -> b) -> (Wrapped a -> Wrapped b)
The type signature of `value` is:
Wrapped a -> a
These are precisely what you need for a comonad. The first function is usually called `extend` and the second `extract`.
You can think of a comonad as a value with some extra context. And that is of course exactly what `chain` does.
See this Stackoverflow question for more about comonads.
Problem
In the `chain` documentation you find: Calling `chain` on a wrapped object will cause all future method calls to return wrapped objects as well. When you've finished the computation, use `value` to retrieve the final value. So does the `chain` function create a monad?