[Haskell-cafe] On finding the right exposition... (Monads)

Joachim Durchholz jo at durchholz.org
Fri Sep 17 20:29:41 UTC 2021

Am 17.09.21 um 21:47 schrieb Viktor Dukhovni:
> Personally [verbal sequential], I find strained analogies unhelpful
> and distracting, so no desk clerks shuffling forms for me.
> I internalised Haskell monads, by implementing the Functor, Applicative
> and Monad instances for Reader and State a few times from scratch.  Once
> those were solid, ReaderT and StateT and their MonadTrans instances.
> Unsurpsingly, I have a mental model built around sequencing of internal
> state updates while passing data from one state to use in choosing the
> next state transition.

I have been finding the Monad expositions misleading - that idea that 
monads are for sequencing or transitions or mutable state always felt 
wrong to me, since the monad laws don't talk about any of these things 
at all.

And as far as I could understand the concept, monads are not about 
state, they're about "composing a linear sequence of functions". The 
functions' types need not be the same (that would degenerate into the 
concept of associativity), but the result type of one function must be 
the parameter type of the next.
The monad can do whatever it likes with the functions - typically, wrap 
them in some other function and construct a function composition; there 
isn't much else you can do with them, though you're not doing much 
justice to the Maybe monad if you see it as a pipeline.
Ah... right... and of course the pseudo associativity. I.e. it doesn't 
matter what parts of the total sequence you construct first.

Of course, state transitions are a fine application of this concept.
Or anything else where you see a function as a computation step and you 
want to run these steps in sequence.
It's just that there are more kinds of monads.
Except if you see Maybe as "do these operations in sequence until you 
hit the first that returns None, then abort". It depends on seeing 
functions as executable things though, and that's not really what 
Haskell is trying to be (or was trying to be 20 years ago, maybe 
everybody is now happy that Haskel finally can express imperative stuff 
via monads... no idea what people think)


More information about the Haskell-Cafe mailing list