In the chain documentation you find:
Calling
chain
on a wrapped object will cause all future method calls to return wrapped objects as well
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.