3 ms·
I find this perspective intriguing, can you elaborate on that? For example why `m a -> (a -> m b) -> m b` but not something else?
by calo_star 5y ago
I find this perspective intriguing, can you elaborate on that? For example why `m a -> (a -> m b) -> m b` but not something else?
- lmm 5y agoSome people describe monads as "programmable semicolons" - they're pretty much the general concept of sequencing, "do this then do that", or indeed of imperative code. I don't think they're necessarily the ideal abstraction - something like ArrowChoice is "better" in a lot of cases - but in practice they seem to come up a hell of a lot, you can represent almost anything as a monad.
- wyager 5y agoWhy monads and not something else? Because monads appear to be a/the mathematical structure underlying the denotation of programs with effects. Why that type signature? You only have two options: that, or m (m a) -> m a. The former is more popular for ergonomic reasons mostly. It doesn’t really matter.
- uryga 5y ago> why `m a -> (a -> m b) -> m b` but not something else? it's basically continuation-passing-style (`a -> m b` is the "continuation"), you might as well ask "why can you represent so many control-flow things using CPS?". idk why, but you can! from another angle, you could compare Monad with the less powerful Applicative. a formulation[0] that's easier to parse than the usual one[1] is: class Functor f => Applicative f where unit :: f () pair :: f a -> f b -> f (a, b) if you're familiar with JS Promises, a rough analogy would be >>= (Monad) Promise.then pair (Applicative) ≈ Promise.all unit (Applicative) = return (Monad) = Promise.resolve ignoring parallelism, you can implement Promise.all using Promise.then, but not the other way around. --- [0] Called "Monoidal" here: https://stackoverflow.com/q/45267953 https://stackoverflow.com/q/45267953 [1] https://en.m.wikibooks.org/wiki/Haskell/Applicative_functors#The_Applicative_class https://en.m.wikibooks.org/wiki/Haskell/Applicative_functors...
- rocqua 5y agoBecause so many types above are m of something. You as a programmer get to decide how that m type works, so you have a lot of control there.