[GHC] #13875: ApplicativeDo desugaring is lazier than standard desugaring

GHC ghc-devs at haskell.org
Mon Jun 26 15:40:35 UTC 2017


#13875: ApplicativeDo desugaring is lazier than standard desugaring
-------------------------------------+-------------------------------------
        Reporter:  dfeuer            |                Owner:  simonmar
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  8.3
      Resolution:                    |             Keywords:  ApplicativeDo
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  Other             |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by dfeuer):

 Replying to [comment:3 simonmar]:

 > To fix this properly we would have to prevent `ApplicativeDo` from
 applying to any statement with a strict pattern match.  In practice I
 doubt anyone is going to write `~p` to make `ApplicativeDo` work, but
 fortunately it still works for simple variable patterns.

 It seems terribly unfortunate, in my opinion, if adding a language
 extension to a module can, ''all by itself'', introduce a memory leak. The
 fix does seem annoying, but I don't think there's another good way. The
 current behavior is both surprising and inconsistent. We generally expect,
 for example, that

 {{{#!hs
   (x,y) <- m
   e
 }}}

 will be exactly the same as

 {{{#!hs
   xy <- m
   case xy of
     (x,y) -> e
 }}}

 but that's not currently the case. Here's an (arguably) more extreme
 example:

 {{{#!hs
 oops m = do
   !xy <- m
   pure (fst xy + snd xy)
 }}}

 With `ApplicativeDo`, the bang pattern is silently ignored.

 So I think the special desugaring should only be used if all the patterns
 are lazy. It might make sense to check whether an expression could
 ''otherwise'' be desugared specially, and offer an optional warning in
 that case.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13875#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list