cvs commit: fptools/ghc/compiler/typecheck TcSimplify.lhs

Simon Peyton Jones simonpj at glass.cse.ogi.edu
Wed May 12 06:55:15 EDT 2004


simonpj     2004/05/12 05:55:14 PDT

  Modified files:
    ghc/compiler/typecheck TcSimplify.lhs 
  Log:
  	---------------------------------
  	Another delicate fix to the way that the
  	Dreaded Monomorpism Restriction is handled
  	---------------------------------
  
       I think this should merge nicely to the STABLE branch
  
  In TcSimplify 1.130 I changed tcSimplifyRestricted (used for
  declarations that fall under the monomorphism restriction) to use Plan
  C.  Unfortunately, it later transpired that George Russel and Serge
  Mechveliani both made somewhat-dubious use of overlapping instances
  that conflicted with this change. Here's the example
  
    instance (HasBinary ty IO) => HasCodedValue ty
  
    foo :: HasCodedValue a => String -> IO a
  
    doDecodeIO :: HasCodedValue a => () -> () -> IO a
    doDecodeIO codedValue view = let { act = foo "" } in  act
  
  You might think this should work becuase the call to 'foo' in the last
  line gives rise to a constraint (HasCodedValue t), which can be
  satisfied by the type sig for doDecodeIO.  But the restricted binding
  act = ... calls tcSimplifyRestricted, and Plan C simplifies the
  constraint using the (rather bogus) instance declaration, and now we
  are stuffed.
  
  This commit implements Plan D, which is like plan B except that it does no
  improvement, and hence avoids plan B's flaw.  See the comments with Plan D.
  
  The only criticism one might make of Plan D is that it may sometimes quantify
  a restricted binding over "too few" type variables; but one can solve that
  by adding a type sig.  So this seems better than the very subtle problems
  with Plan C.
  
  All of this is very much at the margin: George and Sergey are pushing
  their luck.
  
  Revision  Changes    Path
  1.134     +87 -18    fptools/ghc/compiler/typecheck/TcSimplify.lhs


More information about the Cvs-ghc mailing list