I appreciate that PureScript has ado for applicative do-notation instead of overloading do + a language prgama & doesn’t need to have something complicated trying to guess what can be done in parallel. Seems this offers some speedups but now you have implicit things going on & do for monads is supposed to be about expressing sequential data flow.
Generally execution is implicit in Haskell so this is in line with the culture / philosophy of the language. Though, I agree with you that having explicit control over how things are executed is often necessary to engineer things that behave predictably.
Also, Haskell is one of the few languages that lets the programmer hook into the optimizer with rewrite rules.
So this paper can be seen as equivalent to a rewrite rule that rewrites monad binds into applicative <*> for performance reasons.
(there’s also other precedent for this kind of high level optimizations in Haskell. E.g. stream fusion.)
I appreciate that PureScript has
ado
for applicative do-notation instead of overloading do + a language prgama & doesn’t need to have something complicated trying to guess what can be done in parallel. Seems this offers some speedups but now you have implicit things going on &do
for monads is supposed to be about expressing sequential data flow.Generally execution is implicit in Haskell so this is in line with the culture / philosophy of the language. Though, I agree with you that having explicit control over how things are executed is often necessary to engineer things that behave predictably.
Also, Haskell is one of the few languages that lets the programmer hook into the optimizer with rewrite rules. So this paper can be seen as equivalent to a rewrite rule that rewrites monad binds into applicative
<*>
for performance reasons.(there’s also other precedent for this kind of high level optimizations in Haskell. E.g. stream fusion.)