
#10892: ApplicativeDo should use *> and <* -------------------------------------+------------------------------------- Reporter: simonmar | Owner: simonmar Type: task | Status: new Priority: normal | Milestone: 8.0.1 Component: Compiler | Version: 7.11 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by ekmett): Here's a sketch of how this could work: The current patch for `ApplicativeDo` tracks applicative "chains". This would modify the `Applicative` chains you have to hold a `Maybe` pattern instead of a pattern or you could just check for wildcard patterns. There are basically 3 cases for dealing with the chain of (<*>)'s we use today. If you have a prefix of things that don't have meaningful patterns, you can bind them with `(*>)`, just like we'd bind with (>>) before. {{{ do foo;bar;baz; x <- quux; y <- quaffle; return (xyzzy x y) foo *> bar *> baz *> (xyzzy <$> quux <*> quaffle) }}} Otherwise, once you've seen a pattern that actually matters, any subsequent missing patterns can be dropped by using `(<*)` or `(<$)`. The `(<*)` case is mentioned in the description. The `(<$)` case happens for {{{ foo = do bar return whatever }}} which becomes {{{ foo = whatever <$ bar }}} This desugaring should then favor all the right things. `(*>)` is typically a little cheaper than `(<*)`. `(<$)` and `(*>)` are cheaper than `(<$>)` and `(<*>)` when usable. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10892#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler