4 ms·
> 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 "w
by 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...