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?

Original source

Related problems