ApplicativeDo desugaring is lazier than standard desugaring
Suppose I write
import Data.Maybe (isJust)
bangy m = do
(_,_) <- m
return ()
main = print $ isJust (bangy (Just undefined))
If I compile this with ApplicativeDo, it prints True. Otherwise, it throws an exception. The basic problem is that the (correct) bangy function requires a Monad constraint, but ApplicativeDo replaces it with a lazier function that can get by with Functor. I believe it should desugar correctly, and impose a Monad constraint here. To get the Functor constraint should require an explicit lazy pattern match:
bangy m = do
~(_,_) <- m
return ()
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | simonmar |
| Operating system | |
| Architecture |