I would not use -XMonoLocalBinds for all modules -- that will force you to do 
more work.
Instead use it just for the offending Pol3_ module, via {-# LANGUAGE 
MonoLocalBinds #-}

Or, probably better, give a type signature inside moduloBasisx, as suggested in 
the http://hackage.haskell.org/trac/ghc/ticket/4361.  The signature is better 
because it also makes the program easier to understand!

Simon

| -----Original Message-----
| From: Serge D. Mechveliani [mailto:mech...@botik.ru]
| Sent: 21 December 2012 10:08
| To: Simon Peyton-Jones
| Cc: glasgow-haskell-bugs@haskell.org
| Subject: Re: DoCon and GHC
| 
| On Wed, Jun 20, 2012 at 04:56:01PM +0000, Simon Peyton-Jones wrote:
| > Serge
| >
| > I hope you are well.
| >
| > I'm making a significant simplification to the type inference engine,
| > which will have a small knock-on effect in DoCon.
| >
| > I implemented a VERY DELICATE HACK to solve your problem before, but
| > it has become a significant problem to maintain the hack, so I'm
| taking it out.
| >
| > See http://hackage.haskell.org/trac/ghc/ticket/4361, and the comments
| > I have added there, which tell you what change to make.  It's very
| minor!
| >
| > This will take effect from GHC 7.6 onwards.  Thanks
| >
| > Simon
| 
| 
| This is on                 Ticket #4361  "(closed bug: fixed)"
| about compiling  DoCon.
| 
| Its story is as follows.
| 
| * 7.4.0  failed to compile the module  Pol3_  in DoCon due to
|   1) a certain GHC manner of  constraint simplification  (as Simon
| wrote)
|   2) a due to complex enough constraints used in DoCon, in particular,
|      instance (LinSolvRing (Pol a), CommutativeRing a) =>
|                                               LinSolvRing (UPol (Pol a))
|      set in Pol3_.hs
|      (I do not know how to simplify this constraint without loosing
|       generality).
| 
| * 7.4.1  does compile it, but, as Simon wrote, applies for this a very
|   specific and unstable compilation method.
| * 7.6+  removes this latter method, and  Simon P. Jones concludes
| 
| > Happily, it's extremely easy to fix your source code in either of
| > these two ways:
| >
| > * If you use -XMonoLocalBinds (which is in any case implied by -XGADTs
| >   and -XTypeFamilies), then GHC won't generalise the definition of x
| >    in the example, and all will be well.
| >
| > * Alterantively, give a type signature for x, thus (in this case)
| >
| >   moduloBasisx p = let x :: ()
| >                        x = upLinSolvRing p
| >                    in ()
| 
| 
| 
| Now, I am trying  ghc-7.6.1.20121207  built from source on Debian Linux.
| 
| 
| I. I try adding   -XMonoLocalBinds   for compiling  DoCon:
| 
| 
| -- doco.cabal  ------------------------------- ...
| ghc-options:
|   -fno-warn-overlapping-patterns -fwarn-unused-binds
|   -fwarn-unused-matches -fwarn-unused-imports  -XMonoLocalBinds
|   -O
| ----------------------------------------------
| 
| `make build'  fails at the first module:
| 
| ------------------------------------------------------
| module Prelude_
| where
| ...
| instance (DShow a, DShow b) => DShow (a, b)
|   ...
|   where
|   dShows opts (x, y) =  showChar '(' . shows1 x . showString sep .
|                         shows1 y . showChar ')'                   --
| line 628
|         where
|         opts'    = addToShowOptions (- 1) $ opts {parInShow = Parens}
|         sep      = fieldSeparator opts
|         shows1 x = (case parInShow opts of Parens -> id
|                                            _      -> unparensUpper "()")
|                    . dShows opts' x
| 
|   aShows (a, b) =  showString "(pair " . aShows a . showChar ' ' .
|                    aShows b . showChar ')'
| ------------------------------------------------------
| 
| The report is
| 
| runghc Setup.hs build
| Building docon-2.12...
| Preprocessing library docon-2.12...
| [ 1 of 84] Compiling Prelude_         ( Prelude_.hs,
| dist/build/Prelude_.o )
| 
| Prelude_.hs:628:32:
|     Could not deduce (a ~ b)
|     from the context (DShow a, DShow b)
|       bound by the instance declaration at Prelude_.hs:622:10-43
|       `a' is a rigid type variable bound by
|           the instance declaration at Prelude_.hs:622:10
|       `b' is a rigid type variable bound by
|           the instance declaration at Prelude_.hs:622:10
|     In the first argument of `shows1', namely `y'
|     In the first argument of `(.)', namely `shows1 y'
|     In the second argument of `(.)', namely shows1 y . showChar ')'
| ...
| -----------------------
| 
| The line 628 is marked in the code as  "-- line 628".
| 
| 
| I suspect that besides  -XMonoLocalBinds, I need also to add some
| explicit type signatures, for example,
|   dShows opts (x, y) = showChar '(' . shows1 (x :: DShow a => a) .
|                        ...
| 
| Because GHC, probably, finds some contradiction in applying  shows1 to
| x :: a  and to  y :: b.
| 
| 
| II. My another attempt will be  removing  -XMonoLocalBinds
|     (with this, it compiles many modules and stops at  Pol3.hs) and
| inserting a type signature in an appropriate place (this will also need
| to add  ScopedTypeVariables + `forall'
| -- thanks to people for hints
| ).
| 
| If (II) works, then it will be, probably less restrictive than (I).
| 
| This is just the current report of my attempt to compile DoCon with GHC.
| 
| ------
| Sergei


_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to