Ticket #1537 (closed merge: fixed)
do notation translation
| Reported by: | Isaac Dupree | Owned by: | simonpj |
|---|---|---|---|
| Component: | Compiler (Type checker) | Version: | 6.7 |
| Keywords: | Cc: | mnislaih, oleg@… | |
| Operating System: | Unknown/Multiple | ||
| Test Case: | rebindable8, rebindable9 | Architecture: | Unknown/Multiple |
| Type of failure: |
Description (last modified by mnislaih) (diff)
& 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 was an older similar problem. Also, maybe the behavior (in the new version) should be explicitly documented somewhere in the User's Guide.

