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 |