[GHC] #11982: Typechecking fails for parallel monad comprehensions with polymorphic let (GHC 7.10.3 through 8.6.3)

GHC ghc-devs at haskell.org
Fri Jan 25 22:15:46 UTC 2019


#11982: Typechecking fails for parallel monad comprehensions with polymorphic let
(GHC 7.10.3 through 8.6.3)
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  josefs
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.3
      Resolution:                    |             Keywords:  ApplicativeDo
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 There are two different things going on here.

 First, for the program in the Description, there is really no difficulty
 in principle.
 The relevant code is in `TcMatches`:
 {{{
 tcMcStmt ctxt (ParStmt _ bndr_stmts_s mzip_op bind_op) res_ty thing_inside
   = do { let star_star_kind = liftedTypeKind `mkFunTy` liftedTypeKind
        ; m_ty   <- newFlexiTyVarTy star_star_kind

        ...
 }}}
 We have to
 generate code something like
 {{{
 (mzip <stuff1> <stuff2> >>= \((f,y), x) ->
 return (f y True, f x 'c')
 }}}
 Now, the trouble is that `f` is polymophic, so we need to build a tuple
 with polymorphic components, ''and'' we must instantiate `>>=` at a
 polymoprhic type.  Neither of these is truly problematic -- GHC's internal
 language supports impredicative polymorphism, and there is really no
 difficulty with figuring out where the polymorphism is.

 But in fact the instantiation of `(>>=)` goes through the notorious
 `tcSyntaxOp`, which is currently a bug-farm with several open tickets.
 This ticket points out that `tcSyntaxOp` should really be capable of
 impredicative instantiation.  But currently it is not.  Work needed -- but
 much easier that full support for impredicative polymorphism.

 Second, for the program in comment:5, as josef points out in comment:11,
 the ''renamer'' rewrites the program to a form that really would require
 full-on impredicative polymorphism to propagate `f`'s polymorphism.  This
 is really very naughty: the typechecker is supposed to typecheck the
 program the user originally wrote -- and here is a fine example of why
 that is a good principle.

 I think the solution here is for the renamer to annotate with applicative-
 do info, but not really rewrite it.  Then we can typecheck it directly,
 rather than typechecking a rewritten form.

 The exact design of this is beyond the puny limits of my brain right now,
 but that smells like the right direction.  I'd be happy to advise, esp on
 the first bug.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11982#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list