I still think that it would look a lot less bad than JS callback hell, mostly because of syntax.
actA >>= \a ->
actB a >>= \b ->
pure doSomethingWith b
is a lot better (to my eyes) than:
actA(a =>
actB(a, b =>
doSomethingWith(b)
)
)
and it gets worse from there (blocks to have statements to declare variables, or to call multiple functions. pre ES6 those would've also been functions rather than lambdas. Admittedly monad transformers aren't that great, but that's mostly because of the nxm amount of instances (to avoid explicit lifting).