do notation translation
& Really there are two things:
Normally, (do True) fails to compile in GHC because there is no Monad Bool, whereas Haskell-98 translates it to (True).
With -fno-implicit-prelude
, ( according to http://comonad.com/reader/2007/parameterized-monads-in-haskell/ ):
""" Caveat: It appears that GHC enforces the fact that the arguments and results of (>>=) must have a signature like
(>>=) :: forall m a. (...) => m a -> (a -> m b) -> m b
insofar as when you use the do-sugar, your types will not be able to vary. Ideally it should be able to get by with a more liberal signature, but it seems like no one has needed it before now. """
I think do-notation will be the simplest sugar (from one point of view at least) when it just translates to (>;=), (>>), fail, and let..in.. as specified in Haskell98 (or non-Prelude-qualified when -fno-implicit-prelude
, of course).
It appears #303 (closed) was an older similar problem. Also, maybe the behavior (in the new version) should be explicitly documented somewhere in the User's Guide.